SSL Tomcat证书错误

6

我按照http://www.globalsign.com/support/install/install_tomcat.php上的步骤进行操作,并在server.xml文件中使用以下条目:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
    keystoreFile="D:\Tomcat\ukdp.keystore" keystorePass="123456" keyAlias="ukdp"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />

但是在启动过程中会出现以下异常:
SEVERE: Error initializing endpoint
java.io.IOException: Alias name ukdp does not identify a key entry
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:412)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:378)
at 

org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:125)
    at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:496)
    at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:177)
    at org.apache.catalina.connector.Connector.initialize(Connector.java:1059)
    at org.apache.catalina.core.StandardService.initialize(StandardService.java:677)
    at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:792)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:518)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:538)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412)
Mar 14, 2011 4:14:56 PM org.apache.catalina.startup.Catalina load

当我移除如下的keyAlias条目时:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
keystoreFile="D:\Tomcat\ukdp.keystore" keystorePass="123456" 
       maxThreads="150" scheme="https" secure="true"
       clientAuth="false" sslProtocol="TLS" />

在启动过程中出现以下异常:
SEVERE: Socket accept failed
java.net.SocketException: SSL handshake errorjavax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150)
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
    at java.lang.Thread.run(Unknown Source)
Mar 14, 2011 4:20:31 PM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
java.net.SocketException: SSL handshake errorjavax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150)
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
    at java.lang.Thread.run(Unknown Source)
Mar 14, 2011 4:20:31 PM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
2个回答

16
列出密钥库中的条目,使用:
keytool -list -keystore D:\Tomcat\ukdp.keystore -storepass 123456
如果该条目不存在,您需要将其导入为PrivateKeyEntry。 如果存在,请确保其类型是PrivateKeyEntry而不是trustedCertEntry
如果类型为trustedCertEntry并且您想要更改它,则我发现的过程如下:
#Convert to the key type to pkcs12
openssl pkcs12 -export -inkey myserverkey.key -in myserver.crt -out tempstore.p12


#Import to keystore:
keytool -importkeystore -srckeystore tempstore.p12 -srcstoretype PKCS12 -destkeystore keystore.jks

#List:
keytool -list -v -keystore keystore.jks
#Note the alias, usually gets "1", we need to change it

#Change alias:
keytool -changealias -alias 1 -destalias mywantedkeyalias -keystore keystore.jks

myserverkey.keymyserver.crtkeystore.jksmywantedkeyalias做出明显的更改后


这是否与布鲁诺上面的评论“您无法将证书翻译成私钥”不一致? - Matthew Cornell
1
@MatthewCornell 如果你能看到第一行有两个输入,证书文件(.crt)和私钥(.key),那么你不仅仅是在翻译证书,它们正在转换为可以导入到密钥库作为PrivateKeyEntry的pkcs12格式(第二行)。你理解了吗? - Asaf
这几乎很好,但是myserverkey.key从哪里来?我只有一个密钥库文件。 - Edd

5

首先,您的密钥库中有什么。


keytool -list -keystore D:\Tomcat\ukdp.keystore -storepass 123456

如果这里真的没有 "udkp" 键,那就是你的问题所在。

密钥库类型:JKS 密钥库提供者:SUN您的密钥库包含2个条目inter,2011年3月14日,trustedCertEntry, 证书指纹(MD5):72:82:67:20:5F:EC:F2:9F:4B:9A:3C:08:3D:E5:50:82 ukdp,2011年3月14日,trustedCertEntry, 证书指纹(MD5):D5:E8:D3:6E:AB:20:E5:1B:BC:EF:D0:39:B5:AC:37:73 - d-man
1
如果 ukdp 存在,为什么仍然会出现问题? - d-man
我看不出问题所在。 - Bruno Rohée
JSSE提供非常详细的调试信息来解决这种问题。请参阅http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug以激活它们。 - Bruno Rohée
6
事实证明,Tomcat需要一个_PrivateKeyEntry_的条目,而不是_trustedCertEntry_。后者可以使用keytool -genkey生成。我不知道是否可以将一个转换为另一个,但这是一个开始。 - jevon
1
@jevon:当然,你需要私钥来证明你是证书的持有人(这不仅仅适用于Tomcat)。不,你不能仅凭证书将证书“翻译”成私钥:这就是非对称加密的全部意义所在。如果你没有在密钥库中生成私钥,那么你可以将带有证书的私钥导入到密钥库中,但你需要知道它是在哪里生成的。 - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接