Ignore:
Timestamp:
2014-06-01T17:55:24+02:00 (10 years ago)
Author:
Don-vip
Message:

see #10033 - allow remote control to work from osm.org in https on Windows systems by adding updated JOSM localhost certificate to Windows Root Certificates keystore

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java

    r7037 r7206  
    1212import java.net.Socket;
    1313import java.net.SocketException;
     14import java.security.Key;
    1415import java.security.KeyManagementException;
    1516import java.security.KeyStore;
    1617import java.security.KeyStoreException;
    1718import java.security.NoSuchAlgorithmException;
    18 import java.security.UnrecoverableKeyException;
     19import java.security.PrivateKey;
     20import java.security.UnrecoverableEntryException;
     21import java.security.cert.Certificate;
    1922import java.security.cert.CertificateException;
    2023import java.util.Arrays;
     
    3235/**
    3336 * Simple HTTPS server that spawns a {@link RequestProcessor} for every secure connection.
    34  * 
     37 *
    3538 * @since 6941
    3639 */
     
    4245    private static RemoteControlHttpsServer instance;
    4346    private boolean initOK = false;
    44     private SSLContext sslContext; 
     47    private SSLContext sslContext;
    4548
    4649    private static final String KEYSTORE_PATH = "/data/josm.keystore";
     
    5356                KeyStore ks = KeyStore.getInstance("JKS");
    5457                char[] password = KEYSTORE_PASSWORD.toCharArray();
    55                
    56                 // Load keystore
     58
     59                // Load keystore generated with Java 7 keytool as follows:
     60                // keytool -genkeypair -storepass josm_ssl -keypass josm_ssl -alias josm_localhost -dname "CN=localhost, OU=JOSM, O=OpenStreetMap"
     61                // -ext san=ip:127.0.0.1 -keyalg RSA -validity 1825
    5762                try (InputStream in = RemoteControlHttpsServer.class.getResourceAsStream(KEYSTORE_PATH)) {
    5863                    if (in == null) {
     
    6065                    } else {
    6166                        ks.load(in, password);
    62                        
     67
    6368                        if (Main.isDebugEnabled()) {
    6469                            for (Enumeration<String> aliases = ks.aliases(); aliases.hasMoreElements();) {
     
    6671                            }
    6772                        }
    68    
     73
    6974                        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    7075                        kmf.init(ks, password);
    71                        
     76
    7277                        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    7378                        tmf.init(ks);
    74                        
     79
    7580                        sslContext = SSLContext.getInstance("TLS");
    7681                        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    77                        
     82
    7883                        if (Main.isDebugEnabled()) {
    7984                            Main.debug("SSL Context protocol: " + sslContext.getProtocol());
    8085                            Main.debug("SSL Context provider: " + sslContext.getProvider());
    8186                        }
    82                        
     87
     88                        Enumeration<String> aliases = ks.aliases();
     89                        if (aliases.hasMoreElements()) {
     90                            String aliasKey = aliases.nextElement();
     91                            Key key = ks.getKey(aliasKey, password);
     92                            Certificate[] chain = ks.getCertificateChain(aliasKey);
     93                            Main.platform.setupHttpsCertificate(new KeyStore.PrivateKeyEntry((PrivateKey) key, chain));
     94                        }
     95
    8396                        initOK = true;
    8497                    }
    8598                }
    86             } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | 
    87                     IOException | UnrecoverableKeyException | KeyManagementException e) {
     99            } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException |
     100                    IOException | KeyManagementException | UnrecoverableEntryException e) {
    88101                Main.error(e);
    89102            }
     
    136149        super("RemoteControl HTTPS Server");
    137150        this.setDaemon(true);
    138        
     151
    139152        initialize();
    140        
     153
    141154        // Create SSL Server factory
    142155        SSLServerSocketFactory factory = sslContext.getServerSocketFactory();
     
    144157            Main.debug("SSL factory - Supported Cipher suites: "+Arrays.toString(factory.getSupportedCipherSuites()));
    145158        }
    146        
     159
    147160        // Start the server socket with only 1 connection.
    148161        // Also make sure we only listen
     
    151164        this.server = factory.createServerSocket(port, 1,
    152165            InetAddress.getByName(Main.pref.get("remote.control.host", "localhost")));
    153        
     166
    154167        if (Main.isDebugEnabled() && server instanceof SSLServerSocket) {
    155168            SSLServerSocket sslServer = (SSLServerSocket) server;
Note: See TracChangeset for help on using the changeset viewer.