我对使用自签名证书的SSL有疑问。 我在这里使用这个例子http://people.apache.org/~gmazza/restexamples/https-clientserver-grizzly
单元测试完美无缺。但是,如果我开始使用grizzly服务器,并尝试使用curl来获取资源,我会遇到如下错误:
curl -v https://localhost:8443/api/v1/hello
* Adding handle: conn: 0x7ff69b004400
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7ff69b004400) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 8443 (#0)
* Trying ::1...
* Trying fe80::1...
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8443 (#0)
* Server aborted the SSL handshake
* Closing connection 0
curl: (35) Server aborted the SSL handshake
我已经将证书添加到系统密钥链中,并始终信任所有类别。但是,没有浏览器可以获得资源。以下是我从Chrome获取的错误消息。
无法与服务器建立安全连接。这可能是服务器的问题,或者可能需要您没有的客户端身份验证证书。 错误代码:ERR_SSL_PROTOCOL_ERROR
还有其他人遇到过同样的问题吗?
ADD:
对于curl,我使用关键工具生成java密钥库和证书
keytool -genkey -keystore ./keystore_server -alias serverKey -dname "CN=localhost, OU=Jersey, O=Sun Microsystem, L=Prague, ST=Czech Republic, C=CZ"
keytool -export -alias serverKey -rfc -keystore ./keystore_server > ./server.cert
openssl x509 -in server.cert -inform PEM -text -out server.pem
然后我跑了
curl -E server.pem -v https://localhost:8443/api/v1/hello -u "username:password"
但是,我得到了和以前一样的错误。
对于浏览器,我现在已经知道它适用于Firefox和Chrome。但是,我仍然遇到Safari问题。我收到错误消息说Safari无法打开页面,因为safari无法与服务器建立安全连接。任何人都知道如何让safari开心?
答案 0 :(得分:1)
但是,如果我开始使用grizzly服务器,并尝试使用curl获取资源,我会收到类似的错误...
cURL不使用操作系统的钥匙串。该规则的例外是如果 cURL是针对iOS或OS X针对SecureTransport
构建的。请参阅curl.1 the man page和-E
或--cert
选项。即使在这种情况下,它也不适用于可靠的锚点。
如果您要使用特定CA来验证服务器,则应使用--cacert
选项指定它。您还可以使用此选项指定cacert.pem
捆绑包。请参阅curl.1 the man page。
Chrome ...错误代码:
ERR_SSL_PROTOCOL_ERROR
这是一个不同的问题。 Chrome使用操作系统的密钥库。参见Chromium Projects' Root Certificate Policy
要解决此问题,您可能需要查看Getting Chrome to accept self-signed localhost certificate。
根据您的问题发布证书可能是个好主意。使用以下命令生成它(假设其PEM编码):
openssl x509 -in <cert> -inform PEM -text -noout
还有其他人遇到过同样的问题吗?
其他人也可能遇到过这个问题。