OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 144 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
142 ilm 1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
5
 *
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
9
 * language governing permissions and limitations under the License.
10
 *
11
 * When distributing the software, include this License Header Notice in each file.
12
 */
13
 
14
 package org.openconcerto.utils;
15
 
16
import java.io.BufferedReader;
17
import java.io.ByteArrayInputStream;
18
import java.io.File;
19
import java.io.FileReader;
20
import java.io.IOException;
21
import java.security.KeyFactory;
22
import java.security.KeyStore;
23
import java.security.KeyStoreException;
24
import java.security.NoSuchAlgorithmException;
25
import java.security.PrivateKey;
26
import java.security.cert.CertificateException;
27
import java.security.cert.CertificateFactory;
28
import java.security.cert.X509Certificate;
29
import java.security.interfaces.RSAPrivateKey;
30
import java.security.spec.InvalidKeySpecException;
31
import java.security.spec.PKCS8EncodedKeySpec;
32
import java.util.ArrayList;
33
import java.util.List;
34
 
35
import javax.net.ssl.KeyManager;
36
import javax.net.ssl.KeyManagerFactory;
37
import javax.net.ssl.SSLContext;
38
import javax.net.ssl.SSLServerSocketFactory;
39
import javax.xml.bind.DatatypeConverter;
40
 
41
public class PEMImporter {
42
 
43
    public static SSLServerSocketFactory createSSLFactory(File privateKeyPem, File certificatePem, String password) throws Exception {
44
        final SSLContext context = SSLContext.getInstance("TLS");
45
        final KeyStore keystore = createKeyStore(privateKeyPem, certificatePem, password);
46
        final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
47
        kmf.init(keystore, password.toCharArray());
48
        final KeyManager[] km = kmf.getKeyManagers();
49
        context.init(km, null, null);
50
        return context.getServerSocketFactory();
51
    }
52
 
53
    /**
54
     * Create a KeyStore from standard PEM files
55
     *
56
     * @param privateKeyPem the private key PEM file
57
     * @param certificatePem the certificate(s) PEM file
58
     * @param the password to set to protect the private key
59
     */
60
    public static KeyStore createKeyStore(File privateKeyPem, File certificatePem, final String password)
61
            throws Exception, KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
62
        final X509Certificate[] cert = createCertificates(certificatePem);
63
        final KeyStore keystore = KeyStore.getInstance("JKS");
64
        keystore.load(null);
65
        // Import private key
66
        final PrivateKey key = createPrivateKey(privateKeyPem);
67
        keystore.setKeyEntry(privateKeyPem.getName(), key, password.toCharArray(), cert);
68
        return keystore;
69
    }
70
 
71
    private static PrivateKey createPrivateKey(File privateKeyPem) throws Exception {
72
        final BufferedReader r = new BufferedReader(new FileReader(privateKeyPem));
73
        String s = r.readLine();
74
        if (s == null || !s.contains("BEGIN PRIVATE KEY")) {
75
            r.close();
76
            throw new IllegalArgumentException("No PRIVATE KEY found");
77
        }
78
        final StringBuffer b = new StringBuffer();
79
        s = "";
80
        while (s != null) {
81
            if (s.contains("END PRIVATE KEY")) {
82
                break;
83
            }
84
            b.append(s);
85
            s = r.readLine();
86
        }
87
        r.close();
88
        final String hexString = b.toString();
89
        final byte[] bytes = DatatypeConverter.parseBase64Binary(hexString);
90
        return generatePrivateKeyFromDER(bytes);
91
    }
92
 
93
    private static X509Certificate[] createCertificates(File certificatePem) throws Exception {
94
        final List<X509Certificate> result = new ArrayList<X509Certificate>();
95
        final BufferedReader r = new BufferedReader(new FileReader(certificatePem));
96
        String s = r.readLine();
97
        if (s == null || !s.contains("BEGIN CERTIFICATE")) {
98
            r.close();
99
            throw new IllegalArgumentException("No CERTIFICATE found");
100
        }
101
        StringBuffer b = new StringBuffer();
102
        while (s != null) {
103
            if (s.contains("END CERTIFICATE")) {
104
                String hexString = b.toString();
105
                final byte[] bytes = DatatypeConverter.parseBase64Binary(hexString);
106
                X509Certificate cert = generateCertificateFromDER(bytes);
107
                result.add(cert);
108
                b = new StringBuffer();
109
            } else {
110
                if (!s.startsWith("----")) {
111
                    b.append(s);
112
                }
113
            }
114
            s = r.readLine();
115
        }
116
        r.close();
117
 
118
        return result.toArray(new X509Certificate[result.size()]);
119
    }
120
 
121
    private static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException {
122
        final PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
123
        final KeyFactory factory = KeyFactory.getInstance("RSA");
124
        return (RSAPrivateKey) factory.generatePrivate(spec);
125
    }
126
 
127
    private static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException {
128
        final CertificateFactory factory = CertificateFactory.getInstance("X.509");
129
        return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes));
130
    }
131
 
132
}