背景
專案中後臺web服務部署成https服務時,需要使用SSL證書,如果我們不使用公共的CA時,怎麼辦?
不僅如此,因為是小專案,App應用主要是小範圍使用,此時只有IP地址,根本沒有域名,怎麼辦?
下面就給出我的解決方案!
環境
-
後臺服務
IIS託管的Asp .net web api 服務,使用https協議
-
App及開發環境
Xamarin.Forms、VS2019
-
OpenSSL
版本為OpenSSL 1.1.1g,最好版本要大於等於這裡列出的版本,因為這樣才可以直接在命令列中設定subjectAltName 擴充套件資訊,此處很關鍵,下面後提到!
方法
生成證書
以下出現的
10.0.20.11
地址都要替換成實際專案的web伺服器地址
使用openssl執行以下命令生成x509格式的ca證書
openssl req -x509 -nodes -days 365 -addext "subjectAltName = IP:10.0.20.11" -newkey rsa:2048 -keyout test.key -out test.cer
此處-addext "subjectAltName = IP:10.0.20.11"
這個引數很重要,因為我們域名,在app中我們直接通過服務端ip地址訪問介面地址的,如果此時沒有這個subjectAltName 這個擴充套件配置,Android在ca證書認證的時候,會提示Hostname 10.0.20.11 was not verified
錯誤。
然後屬性證書生成的必要資訊:
# openssl req -x509 -nodes -days 365 -addext "subjectAltName = IP:10.0.20.11" -newkey rsa:2048 -keyout test.key -out test.cer
Generating a RSA private key
.......................................................+++++
......+++++
writing new private key to 'test.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:JS
Locality Name (eg, city) []:WX
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test
Organizational Unit Name (eg, section) []:Test
Common Name (e.g. server FQDN or YOUR name) []:10.0.20.11
Email Address []:
其中 Common Name (e.g. server FQDN or YOUR name) []:10.0.20.11
後面填寫的是服務端的IP地址(如果是域名,就是公司的域名)
此時會在當前目錄下生成對應的key和cer證書檔案
生成pfx檔案
pfx是帶有私鑰的數字證書,可以通過IIS管理器中匯入,用作伺服器證書。
執行以下命令:
# openssl.exe pkcs12 -export -in test.cer -inkey test.key -out test.pfx
Enter Export Password:
Verifying - Enter Export Password:
其中 test.cer 是數字證書,包含公鑰等資訊,test.key是私鑰,兩個合併打包進test.pfx中。
如果需要對pfx加密,可以輸入密碼,此處未應用密碼!
匯入服務端證書
開啟IIS管理器,開啟伺服器證書,選擇匯入,選擇前面建立好的pfx檔案,匯入即可!
應用證書
新增網站,繫結型別選擇https,在ssl證書中下拉選擇前面匯入的證書即可
Android專案配置
把數字證書新增未Android資源
在Resource檔案下新增raw資料夾,新增csr檔案,並在屬性中把生成操作選擇為AndroidResource
。
把證書配置為受信的證書
在network_security_config.xml
檔案配置如下內容:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<!-- Release port -->
<domain includeSubdomains="true">10.0.20.11</domain>
<trust-anchors>
<certificates src="@raw/test"/>
</trust-anchors>
</domain-config>
</network-security-config>
trust-anchors
中的certificates
引用上傳的證書,這裡是test.cer,domain
中新增服務端IP即可。