Keytool创建受信任的自签名证书

我试图使用(java)密钥工具创建一个自签名证书,但是当我尝试使用它时,出现以下异常(有关完整异常,请参见底部)。

...<5 more exceptions above this>

Caused by: sun.security.validator.ValidatorException: No trusted certificate found

at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304)

at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107)

at sun.security.validator.Validator.validate(Validator.java:203)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)

at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)

... 22 more

我知道我可以使用以下代码绕过此代码:

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLSession;

HostnameVerifier hv = new HostnameVerifier() {

public boolean verify(String urlHostName, SSLSession session) {

System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());

return true;

}

};

HttpsURLConnection.setDefaultHostnameVerifier(hv);

(资源)

但是我对此解决方案不感兴趣,因为我认为这会造成安全漏洞。(如果我错了,请纠正我)。

谁能指出我正确的方向?我目前正在本地进行测试,因此很容易进行更改。我可以访问服务器代码,客户端代码和.keystore文件。

回答:

我试图为客户端和服务器使用一个.keystore文件,但是为了简化我的问题,我创建了server.keystore(请参见下文)和client.truststore(请参见下文)。我有足够的信心相信这些证书是正确的,但是如果有人能够证明我将不胜感激。

hostname[username:/this/is/a/path][711]% keytool -list -keystore server.keystore -v

Enter keystore password:

Keystore type: JKS

Keystore provider: SUN

Your keystore contains 1 entry

Alias name: hostname

Creation date: Feb 4, 2010

Entry type: PrivateKeyEntry

Certificate chain length: 1

Certificate[1]:

Owner: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname

Issuer: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname

Serial number: 4b6b0ea7

Valid from: Thu Feb 04 13:15:03 EST 2010 until: Wed May 05 14:15:03 EDT 2010

Certificate fingerprints:

MD5: 81:C0:3F:EC:AD:5B:7B:C4:DA:08:CC:D7:11:1F:1D:38

SHA1: F1:78:AD:C8:D0:3A:4C:0C:9A:4F:89:C0:2A:2F:E2:E6:D5:13:96:40

Signature algorithm name: SHA1withDSA

Version: 3

*******************************************

*******************************************

hostname[username:/this/is/a/path][713]% keytool -list -keystore client.truststore -v

Enter keystore password:

Keystore type: JKS

Keystore provider: SUN

Your keystore contains 1 entry

Alias name: mykey

Creation date: Feb 4, 2010

Entry type: trustedCertEntry

Owner: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname

Issuer: CN=hostname, OU=hostname, O=hostname, L=hostname, ST=hostname, C=hostname

Serial number: 4b6b0ea7

Valid from: Thu Feb 04 13:15:03 EST 2010 until: Wed May 05 14:15:03 EDT 2010

Certificate fingerprints:

MD5: 81:C0:3F:EC:AD:5B:7B:C4:DA:08:CC:D7:11:1F:1D:38

SHA1: F1:78:AD:C8:D0:3A:4C:0C:9A:4F:89:C0:2A:2F:E2:E6:D5:13:96:40

Signature algorithm name: SHA1withDSA

Version: 3

*******************************************

*******************************************

回答:

我认为包含整个异常可能是有用的:

javax.xml.soap.SOAPException: java.io.IOException: Could not transmit message

at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:115)

at org.jboss.ws.core.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:66)

at com.alcatel.tpapps.common.utils.SOAPClient.execute(SOAPClient.java:193)

at com.alcatel.tpapps.common.utils.SOAPClient.main(SOAPClient.java:280)

Caused by: java.io.IOException: Could not transmit message

at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:192)

at org.jboss.ws.core.client.SOAPRemotingConnection.invoke(SOAPRemotingConnection.java:77)

at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:106)

... 3 more

Caused by: org.jboss.remoting.CannotConnectException: Can not connect http client invoker. sun.security.validator.ValidatorException: No trusted certificate found.

at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:368)

at org.jboss.remoting.transport.http.HTTPClientInvoker.transport(HTTPClientInvoker.java:148)

at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:141)

at org.jboss.remoting.Client.invoke(Client.java:1858)

at org.jboss.remoting.Client.invoke(Client.java:718)

at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:171)

... 5 more

Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1584)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)

at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)

at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)

at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:877)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1089)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1116)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1100)

at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402)

at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)

at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:857)

at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)

at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:288)

... 10 more

Caused by: sun.security.validator.ValidatorException: No trusted certificate found

at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304)

at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107)

at sun.security.validator.Validator.validate(Validator.java:203)

at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)

at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)

at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)

... 22 more

回答:

您将需要在服务器和客户端之间“建立信任”(我假设您只需要执行服务器端身份验证)。这是因为您使用自签名证书。这涉及将服务器的证书导入到客户端信任存储中:

在服务器端:

keytool -keystore <keystore file> -alias <alias> -export -file <certfilename>.cert

将.cert文件复制到客户端,然后:

keytool -keystore <truststore file> -alias <alias> -import -file <certfilename>.cert

以上是 Keytool创建受信任的自签名证书 的全部内容, 来源链接: utcz.com/qa/403624.html

回到顶部