如何调用HTTPS webserivce春季启动与证书

问题描述:

我得到以下异常,同时呼吁在春季启动HTTPS的Web服务与Apache CXF面对如何调用HTTPS webserivce春季启动与证书

出现SSLHandshakeException调用https://fanava.shaparak.ir:443/merchantwebservice/jax/merchantAuth:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到需要什么样的配置来调用这个服务请求的目标

有效的认证路径?

classClient:

@Configuration 
public class WSClient { 
    @Bean(name = "PaymentWebService") 
    public PaymentWebService PaymentWebServiceCLient() throws MalformedURLException { 
      JaxWsProxyFactoryBean factory; 
      factory = new JaxWsProxyFactoryBean(); 
      factory.setServiceClass(PaymentWebService.class); 
      factory.setAddress("http://localhost:8080/soap-api/merchantAuth_1.0"); 
      return (PaymentWebService) factory.create(); 
    } 
} 

1.get your webservice you want。

2.用此证书创建密钥库。

3.ssl配置客户端密钥库:

@Configuration 
public class WebServiceClient { 

@Inject 
private PaymentProperties paymentProperties; 

@Autowired 
private ResourceLoader resourceLoader; 

@Bean(name = "PaymentWebService") 
public PaymentWebService PaymentWebServiceCLient() throws MalformedURLException { 

    JaxWsProxyFactoryBean factory; 
    factory = new JaxWsProxyFactoryBean(); 
    factory.setServiceClass(PaymentWebService.class); 
    // factory.setAddress("http://localhost:8080/ws/merchantAuth_1.0"); 
    factory.setAddress(paymentProperties.getWsPublicUrl()); 

    PaymentWebService service = (PaymentWebService) factory.create(); 
    try { 
     final Client client = ClientProxy.getClient(service); 
     setupSsl((HTTPConduit) ClientProxy.getClient(service).getConduit()); 
    } catch (Exception e) { 
    } 
    return service; 
} 

private void setupSsl(HTTPConduit httpConduit) throws Exception { 

    final TLSClientParameters tlsCP = new TLSClientParameters(); 

    final String keyStoreLoc = paymentProperties.getSsl().getKeyStore(); 
    final String keyPassword = paymentProperties.getSsl().getKeyStorePassword(); 
    final String keystoreType = paymentProperties.getSsl().getKeyStoreType(); 

    final KeyStore keyStore = KeyStore.getInstance(keystoreType); 
    Resource resource1 = resourceLoader.getResource(keyStoreLoc); 
    keyStore.load(resource1.getInputStream(), keyPassword.toCharArray()); 
    final KeyManager[] myKeyManagers = getKeyManagers(keyStore, keyPassword); 
    tlsCP.setKeyManagers(myKeyManagers); 

    final String trustStoreLoc = paymentProperties.getSsl().getTrustStore(); 
    final String trustStorePassword = paymentProperties.getSsl().getTrustStorePassword(); 
    final String trustStoreType = paymentProperties.getSsl().getTrustStoreType(); 

    final KeyStore trustStore = KeyStore.getInstance(trustStoreType); 
    Resource resource2 = resourceLoader.getResource(trustStoreLoc); 
    trustStore.load(resource2.getInputStream(), trustStorePassword.toCharArray()); 
    final TrustManager[] myTrustStoreKeyManagers = getTrustManagers(trustStore); 
    tlsCP.setTrustManagers(myTrustStoreKeyManagers); 

    httpConduit.setTlsClientParameters(tlsCP); 
} 

private static TrustManager[] getTrustManagers(KeyStore trustStore) 
     throws NoSuchAlgorithmException, KeyStoreException { 
    String alg = KeyManagerFactory.getDefaultAlgorithm(); 
    TrustManagerFactory fac = TrustManagerFactory.getInstance(alg); 
    fac.init(trustStore); 
    return fac.getTrustManagers(); 
} 

private static KeyManager[] getKeyManagers(KeyStore keyStore, String keyPassword) 
     throws GeneralSecurityException, IOException { 
    String alg = KeyManagerFactory.getDefaultAlgorithm(); 
    char[] keyPass = keyPassword != null ? keyPassword.toCharArray() : null; 
    KeyManagerFactory fac = KeyManagerFactory.getInstance(alg); 
    fac.init(keyStore, keyPass); 
    return fac.getKeyManagers(); 
} 
} 

网站的根证书不在JVM信任。所以,如果你将根证书导入<path_to>/jre/lib/security/cacerts我想你会没事的。

+0

请解释一下,如果它可以描述的配置步骤。 –