我想将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
答案 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等,否则没有理由这样做。