自签名证书和Nativescript Android应用

时间:2019-01-31 21:58:34

标签: android ssl nativescript

我正在开发要在Android模拟器中调试的Nativescript应用程序。我在该应用程序中有一个服务,该服务调用通过HTTPS访问的ASP.Net Core API。我已经生成了一个自签名证书,并使用以下Powershell脚本将其添加到我的个人和受信任的商店中

$selfSignedCert = New-SelfSignedCertificate `
-Subject "CN=10.0.2.2" `
-KeyExportPolicy Exportable `
-FriendlyName "My self-signed certificate" `
-DnsName "localhost","10.0.2.2" `
-HashAlgorithm sha256 `
-KeyLength 2048 `
-NotAfter (Get-Date).AddYears(1) `
-CertStoreLocation "Cert:\CurrentUser\My" `
-TextExtension @("2.5.29.19 ={critical} {text}ca=true")

$thumbprint = $selfSignedCert.Thumbprint

Export-Certificate -Cert cert:\CurrentUser\my\$thumbprint -FilePath 
c:\Temp\MyCert.cer -force

Import-Certificate -filePath c:\Temp\MyCert.cer -CertStoreLocation 
"cert:\CurrentUser\Root"

然后我已经更新了application.json的API,以从我的商店(即

)提供此证书
{
    "Kestrel": {
      "Endpoints": {
        "HttpsInlineCertStore": {
          "Url": "https://localhost:5001",
            "Certificate": {
              "Subject": "10.0.2.2",
              "Store": "My",
              "Location": "CurrentUser"
            }
          }
        }
      }
 }

我已将同一证书上传到我的Android仿真器,并在此处将其安装在“受信任的凭据”中

enter image description here

和此处的用户凭据

enter image description here

我已经将AndroidManifest.xml文件更新为包括network_security_config,即

<application
    android:name="com.tns.NativeScriptApplication"
    android:allowBackup="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:debuggable="true"
    android:networkSecurityConfig="@xml/network_security_config">

network_security_config在哪里

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

但是,当我尝试从Nativescript应用程序中调用API时,出现以下错误

JS:     "originalStack": "Error: javax.net.ssl.SSLPeerUnverifiedException: Hostname 10.0.2.2 not verified:\n    certificate: sha1/Ls/XF5mOCTPFkwc7SY//8DELFQU=\n    DN: CN=10.0.2.2\n    subjectAltNames: [localhost, 10.0.2.2]\n    at new ZoneAwareError (file:///data/data/org.nativescript.koffi/files/app/vendor.js:80939:33)\n    at onRequestComplete (file:///data/data/org.nativescript.koffi/files/app/vendor.js:100228:34)\n
   at Object.onComplete (file:///data/data/org.nativescript.koffi/files/app/vendor.js:100220:13)",
JS:     "zoneAwareStack": "Error: javax.net.ssl.SSLPeerUnverifiedException: Hostname 10.0.2.2 not verified:\n    certificate: sha1/Ls/XF5mOCTPFkwc7SY//8DELFQU=\n    DN: CN=10.0.2.2\n    subjectAltNames: [localhost, 10.0.2.2...

这是因为证书是自签名的,而不是来自受信任的CA,即使我的XML配置指向其信任锚的user也是如此吗?开发Android应用程序时可以使用自签名证书吗?

1 个答案:

答案 0 :(得分:0)

通用名称 (CN) 不应是 IP 地址。您必须将备用名称 (SAN) 设置为 IP 地址 - 在您的情况下为 10.0.2.2。

请在脚本中添加参数“-SAN ”。 对于 powershell 脚本,请参阅此处的“SubjectAlternativeName”部分:https://www.sysadmins.lv/blog-en/self-signed-certificate-creation-with-powershell.aspx

您也可以使用其他工具生成证书/密钥,例如 openssl 和 keytool。我发现生成的最简单方法是使用 keytool: https://medium.com/@piraveenaparalogarajah/ssl-issues-when-integrating-android-applications-with-local-is-server-7355b681dbc9