Choosing SSL client certificate in Java

后端 未结 3 1604
名媛妹妹
名媛妹妹 2020-11-28 08:52

Our system communicates with several web services providers. They are all invoked from a single Java client application. All the web services up until now have been over SSL

3条回答
  •  温柔的废话
    2020-11-28 09:17

    I initialized EasySSLProtocolSocketFactory and Protocol instances for different endpoints and register the protocol with unique key like this:

    /**
     * This method does the following:
     * 1. Creates a new and unique protocol for each SSL URL that is secured by client certificate
     * 2. Bind keyStore related information to this protocol
     * 3. Registers it with HTTP Protocol object 
     * 4. Stores the local reference for this custom protocol for use during furture collect calls
     * 
     *  @throws Exception
     */
    public void registerProtocolCertificate() throws Exception {
        EasySSLProtocolSocketFactory easySSLPSFactory = new EasySSLProtocolSocketFactory();
        easySSLPSFactory.setKeyMaterial(createKeyMaterial());
        myProtocolPrefix = (HTTPS_PROTOCOL + uniqueCounter.incrementAndGet());
        Protocol httpsProtocol = new Protocol(myProtocolPrefix,(ProtocolSocketFactory) easySSLPSFactory, port);
        Protocol.registerProtocol(myProtocolPrefix, httpsProtocol);
        log.trace("Protocol [ "+myProtocolPrefix+" ] registered for the first time");
    }
    
    /**
     * Load keystore for CLIENT-CERT protected endpoints
     */
    private KeyMaterial createKeyMaterial() throws GeneralSecurityException, Exception  {
        KeyMaterial km = null;
        char[] password = keyStorePassphrase.toCharArray();
        File f = new File(keyStoreLocation);
        if (f.exists()) {
            try {
                km = new KeyMaterial(keyStoreLocation, password);
                log.trace("Keystore location is: " + keyStoreLocation + "");
            } catch (GeneralSecurityException gse) {
                if (logErrors){
                    log.error("Exception occured while loading keystore from the following location: "+keyStoreLocation, gse);
                    throw gse;
                }
            }
        } else {
            log.error("Unable to load Keystore from the following location: " + keyStoreLocation );
            throw new CollectorInitException("Unable to load Keystore from the following location: " + keyStoreLocation);
        }
        return km;
    }   
    

    When I have to invoke the web service, I do this (which basically replace "https" in the URL with https1, or https2 or something else depending on the Protocol you initialized for that particular endpoint):

    httpClient.getHostConfiguration().setHost(host, port,Protocol.getProtocol(myProtocolPrefix));
    initializeHttpMethod(this.url.toString().replace(HTTPS_PROTOCOL, myProtocolPrefix));
    

    It works like a charm!

提交回复
热议问题