当前位置: 首页 > 知识库问答 >
问题:

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

宇文飞羽
2023-03-14

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

我的restapi部署在tomcat catalina容器(tomcat版本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#12bundle

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请求

我有一个客户的pkcs#12文件。我在restapi中看到了opensslx509-pubkey-noout。证书

这就是. 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_客户端抛出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资源-Tomcat 7的相互认证,这很好地解释了建立TLS通信的原因。但是具有相同问题的无法加载PEM客户端证书。这是我的代码Tlsv1.2


共有1个答案

邵亦
2023-03-14
keytool -import -alias root -keystore restapi.jks -trustcacerts -file -trustcacerts -file restapi.cert

问题就出在这里。所完成的工作就是导入签名的证书。您还需要导入私钥。你真的应该在这里只使用keyool

keytool -genkey ...
keytool -selfcert

始终使用相同的别名。你可以扔掉你现有的密钥库,它对人或动物都没有用。

这些都有记录。请参阅JSSE参考指南。

您也可以使用openssl完成这一切,但是您最终需要一个PKCS#12密钥存储文件,您可以直接在Java中使用该文件。没有理由这样做,除非您还在处理基于OpenSSL的系统,如Apache HTTPD、MySQL、OpenLDAP等。

 类似资料:
  • 我需要创建web服务客户端,这家提供服务的公司向我们发送wsdl文件。我有wsdl文件、用户名和密码、服务url和txt文件,其中包含一些密钥,比如“20A9 38 4e 82 3a 94 d1…”。服务器有自签名证书,我试图通过InstallCert获取证书。java,使用keytool等生成密钥库。当我使用axis2 wsdl2java从wsdl生成客户端时,它会生成客户端,但在生成过程结束时

  • 问题内容: 我正在连接到以前成功使用过的Web服务,但是现在他们已经更改了主机名并向我发送了两个.pem文件。一个是CA,另一个是我的新客户证书。 (我将Java 1.5,Spring + Spring Web Services与Apache httpclient一起使用,但是我怀疑我的问题是证书,密钥和SSL本身。) 我已经导入了.pem文件以及从Firefox导出到cacerts中的主机的.c

  • 问题内容: 我正在尝试使用自签名服务器证书建立TLS连接。 我使用以下示例代码生成了证书:http : //golang.org/src/pkg/crypto/tls/generate_cert.go 我相关的客户端代码如下所示: 以及类似的服务器代码: 因为服务器证书是自签名的,所以对于服务器和客户端CA_Pool使用相同的证书,但这似乎不起作用,因为我总是会收到此错误: 我怎么了 问题答案:

  • 我正在使用节点0.10.26,并试图通过客户端验证建立https连接。 服务器代码: 客户代码: 我使用以下命令创建了证书,每次都将“uname-n”的结果作为“Common Name”提供: 我已经使用客户端和服务器证书的所有组合(即:[(server1,client1),(server1,client2),(server2,client1),(server2,client1),(server2

  • 问题内容: 我完全被困在这里。我有一个Java客户端代码,需要使用自签名证书连接到SSL服务器。 仅 当我在服务器端禁用SSLv2支持时, 才会 出现此问题。 痕迹是 在服务器端,我可以看到以下跟踪: 如果启用SSL2,我会看到 而且一切正常。 我还知道那不是服务器端的东西,因为与其他软件连接可以正常工作。 知道我在做什么错吗? 还有人知道这个“读取客户端问候A / B”是什么意思吗? 谢谢 更新