我正在开发要在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仿真器,并在此处将其安装在“受信任的凭据”中
和此处的用户凭据
我已经将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应用程序时可以使用自签名证书吗?
答案 0 :(得分:0)
通用名称 (CN) 不应是 IP 地址。您必须将备用名称 (SAN) 设置为 IP 地址 - 在您的情况下为 10.0.2.2。
请在脚本中添加参数“-SAN
您也可以使用其他工具生成证书/密钥,例如 openssl 和 keytool。我发现生成的最简单方法是使用 keytool: https://medium.com/@piraveenaparalogarajah/ssl-issues-when-integrating-android-applications-with-local-is-server-7355b681dbc9