javax.net.ssl.SSLPeerUnverifiedException:未验证主机名:

时间:2015-06-10 00:57:54

标签: java android ssl https okhttp

我正在尝试使用HTTPS连接自签名证书 我已经按照此处提到的步骤创建了自签名证书 - Creating Self-signed certificate 即使在浏览器中一切正常,它只向我显示我的证书由未知CA签名的消息 但我的证书中的FQDN(服务器名称不匹配)名称有问题,因为我在生成证书时设置了错误的名称。
我已经重新生成它,现在没有这样的错误。

我需要使用移动Android客户端的服务器sertificate,我找到了关于此问题的精彩文章 - Use Retrofit with a self-signed or unknown SSL certificate in Android。 我已经遵循了所有步骤,但不幸的是得到了一个错误(例外)。

javax.net.ssl.SSLPeerUnverifiedException: Hostname 195.xx.xx.xx not verified:
    certificate: sha1/qvH7lFeijE/ZXxNHI0B/M+AU/aA=
    DN: 1.2.840.113549.1.9.1=#160e63726f73704078616b65702e7275,CN=195.xx.xx.xx,OU=Departament of Development,O=CROSP Solutions,L=Chernihiv,ST=Chernihiv,C=UA
    subjectAltNames: []
            at com.squareup.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:124)

正如您所看到的主机名相同,但仍然存在错误 请帮忙解决这个问题,我将不胜感激任何帮助 谢谢。

伪SOLUTION

当然我之前搜索过HostName Verifier Solution 我试过了,它有效。但是可以使用这种解决方法,我将证书添加到我的应用程序中,以便像在前面的示例中一样动态地读取它,它是否仍然在这种情况下使用。

OkHttp解决方案是一行。 (如果您按照教程中的所有步骤操作)。

 okHttpClient.setHostnameVerifier(new NullHostNameVerifier());

但我仍然觉得这不是最好的解决方案,请有任何想法吗?

3 个答案:

答案 0 :(得分:16)

有趣的是,如果请求主机是IP,那么" CN"不习惯匹配它;相反,

http://tools.ietf.org/html/rfc2818#section-3.1

  

iPAddress subjectAltName必须出现在证书中,并且必须与URI中的IP完全匹配"

如果您使用java的keytool,可以通过

完成
keytool -genkeypair  -ext SAN=IP:195.xx.xx.xx    ........

NullHostNameVerifier也适用于您的用例。您的客户只信任一个证书;只要连接使用该证书,您就是安全的;主持人名称并不重要。

答案 1 :(得分:3)

自签名证书仅适用于开发。您无法使用它,因为您知道它未经过验证,如果没有CA批准您,应用和浏览器就会赢得您的信任。

所以,这不是一个解决方案'对于您的实时应用程序,但仅测试它是否有效(并且如果有的话,将使用有效的证书)。因为您允许所有主机名(或者至少是硬编码的主机名,如果将其限制为少数主机名)并且两者都不好。

您是否计划在您的实时应用中使用自签名证书?

答案 2 :(得分:-1)

对于 return (fetch('/assets/file-samples/template.xlsx') .then((res) => { return res.arrayBuffer(); }) .then((buf) => { return new File([buf], 'template.xlsx', {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); }) ); ,您可以使用:

this.getSampleFile(fileType, extension).then((blankFile) => {
                    client.api('me/drive/root:/yourfolder/' + 'yourName.xlsx' + ':/content')
                        .put(blankFile).then((file) => {
                        console.log(file)
                    }, (err) => {
                        console.log(err)
                    });
                });