使用自签名SSL证书时SSLPeerUnverifiedException

时间:2017-04-16 19:27:46

标签: android ssl openssl ssl-certificate self-signed

我已经创建了一个用于测试目的的slef签名SSL证书。当我从浏览器中打开https://localhost时,它工作正常,现在我正在关注this指南,以便在Android中添加我自己的TrustManager

当我尝试使用我的机器的IP address连接到服务器时,它会抛出

javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.10.3 not verified:

虽然我能够使用HostnameVerifier

解决它
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
        return hostname.trim().equals("192.168.10.3") || hv.verify(hostname, session);
    }
};   

但我仍然想知道我在这里缺少什么? 我是否仍然使用自定义HostnameVerifier正确配置?以下是我的输出 证书

I/System.out: ca=C=PK, L=Islamabad, O=Self, OID.1.2.840.113549.1.9.1=#16176D616C6C617564696E71617A6940676D61696C2E636F6D, CN=https://192.168.10.3

我使用以下命令运行openssl服务器

openssl s_server -key rsa.key -cert allaudin.pem -accept 4000 -WWW

1 个答案:

答案 0 :(得分:1)

您可以在自签名SSL证书文件中使用Alternative Names作为IP地址。

我在github上写了一个bash文件,用于生成替代名称中的自签名证书,您可以复制openssl.cnf并自定义您的openssl配置。如果要使用现有的私钥,则bash文件应为:

#!/bin/bash
KEY_FILE="server.key"
#######################################################
## Remove all generated files                        ##
#######################################################

rm -f  server.crt keystore.p12 keystore.jks

#######################################################
## generate x509 certificate                         ##
#######################################################

openssl req -new -x509 -key $KEY_FILE -sha256 -out server.crt -days 730 -config openssl.cnf
openssl x509 -in server.crt -text -noout

#######################################################
## adding self-signed certificate into jks key store ##
#######################################################

PASSWORD="password"
openssl pkcs12 -export -name test -in server.crt -inkey $KEY_FILE -out keystore.p12 -password "pass:$PASSWORD"
keytool -importkeystore -destkeystore keystore.jks -srckeystore keystore.p12 -srcstorepass $PASSWORD -srcstoretype pkcs12 -alias test -storepass $PASSWORD

#######################################################
## Remove pkcs12 keystore                            ##
#######################################################
rm -f keystore.p12

使用openssl x509 -in **.crt -text -noout查看自签名证书文件中是否有其他名称。 server.crt中的替代名称是:

X509v3 Subject Alternative Name:
        IP Address:127.0.0.1

AND 根据TestCase提出Android unknown certificate authority已在java8& junit5,如果你想在Android中测试,你需要进行一些转换。