【问题标题】:SSLPeerUnverifiedException while using self signed SSL certificate使用自签名 SSL 证书时出现 SSLPeerUnverifiedException
【发布时间】:2017-09-12 11:08:33
【问题描述】:

我创建了一个自签名 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

【问题讨论】:

  • https:// 前缀不应成为通用名称的一部分
  • 没有前缀也是不行的。我试过了。
  • 尝试在证书的 SAN 字段或 dNSName 字段中使用 IP。我很确定其中一个过去对我有用。如果可行,请发布,我会将其转换为答案。
  • 如何添加 SAN 字段?

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


【解决方案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根据Android unknown certificate authority 具有TestCase 已在java8 和junit5 中编写,如果您想在Android 中进行测试,则需要进行一些转换。

【讨论】:

  • @mallaudin 测试用例在 android 中失败?我没有在我的电脑上安装 Android 环境。您可以复制 TestCase 并在 Android 中运行它。
  • @mallaudin 您可以使用openssl x509 -in **.crt -text -noout 查看证书文件中是否有替代名称。
  • @mallaudin 您可以在github 上找到并下载所有文件。并且所有的test都是java平台通过的,我觉得Android可以通过。
  • 我在输出中没有任何备用名称
  • @mallaudin 您可以在openssl.cnf 中查看更多详细信息。选择行是如何在证书中配置替代名称。添加替代名称您必须使用配置文件。
猜你喜欢
  • 2021-09-29
  • 2020-05-29
  • 1970-01-01
  • 2020-10-25
  • 2017-02-18
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多