带有tomcat服务器的自签名证书的TLS - 无法加载PEM客户端证书

时间:2017-08-24 08:19:24

标签: java tomcat ssl curl https

我想将TLS用于我的REST API,我计划创建自签名证书,并为我的restapi客户提供公钥。

我的restapi部署在tomcat catalina容器(tomcat version 8.0.42)上。

我的测试步骤如下所示,

服务器端

1)我使用openssl

创建了一个自签名证书
openssl genrsa -out restapi.key 2048                                                                   

openssl req -new -key restapi.key -out restapi.csr                                                     

openssl x509 -req -days 24855 -in restapi.csr -signkey restapi.key -out restapi.cert 

2)创建了PKCS#12 bundle

openssl pkcs12 -export -in restapi.cert -inkey restapi.key -out restapi.p12 -name restapi

3)然后配置tomcat启用TLS(keystoreType为"PKCS12"),并启动tomcat

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"                       
        maxThreads="150" 
        SSLEnabled="true" 
        scheme="https" 
        secure="true"                            
        keystoreFile="/Users/prayagupd/restapi.p12" 
        keystoreType="PKCS12"
        keystorePass="prayagupd"                          
        clientAuth="true" 
        sslProtocol="TLS" /> 

客户端

4)发送了https请求

I have same pkcs#12 file为客户提供服务。 I saw openssl x509 -pubkey -noout -in restapi.cert > pubkey.pem也不确定这个是否是我需要的。

这是.p12权限看起来像

21765315 -rw-r--r--  1 prayagupd  NORD\Domain Users  2596 Aug 24 01:34 restapi.p12

当我发送https请求时,它失败并出现以下错误(使用curl 7.55.1

curl -v --cert restapi.p12 https://localhost:8443/restapi/health
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8443 (#0)
* ALPN, offering http/1.1
* could not load PEM client certificate, OpenSSL error error:0906D06C:PEM routines:PEM_read_bio:no start line, (no key found, wrong pass phrase, or wrong file format?)
* Closing connection 0
curl: (58) could not load PEM client certificate, OpenSSL error error:0906D06C:PEM routines:PEM_read_bio:no start line, (no key found, wrong pass phrase, or wrong file format?)

$ curl --cert restapi.p12:restapi https://localhost:8443/restapi/health
curl: (58) could not load PEM client certificate, OpenSSL error error:0906D06C:PEM routines:PEM_read_bio:no start line, (no key found, wrong pass phrase, or wrong file format?)

如果我绕过TLS,它会工作,

$ curl --insecure https://localhost:8443/restapi/health
{"id":3,"eventId":"config_sucks","status":"Sky is green"}

openssl s_client抛出ssl握手失败,

$ openssl s_client -connect localhost:8443 -showcerts
CONNECTED(00000003)
59281:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59.60.1/src/ssl/s23_lib.c:185:

注意

我找到了一个SO资源 - Mutual authentication with Tomcat 7,它很好地解释了建立TLS通信。但是遇到同样的问题could not load PEM client certificate。 这是我的代码 - Tlsv1.2

1 个答案:

答案 0 :(得分:1)

keytool -import -alias root -keystore restapi.jks -trustcacerts -file -trustcacerts -file restapi.cert

问题出在这里。所有这一切都是导入签名证书。您还需要导入私钥。除了这里的keytool之外,你应该真的只使用它:

keytool -genkey ...
keytool -selfcert

始终使用相同的别名。你可以扔掉你现有的密钥库,它对人或野兽毫无用处。

这都记录在案。请参阅JSSE参考指南。

您也可以使用openssl完成所有操作,但您最终需要使用PKCS#12密钥库文件,您可以直接在Java中使用它。除非你也在处理基于OpenSSL的系统,例如Apache HTTPD,MySQL,OpenLDAP等,否则没有理由这样做。