Xamarin Android使用自簽名證書

Liuww06發表於2021-10-01

背景

專案中後臺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檔案,匯入即可!

image-20210929162907845

應用證書

新增網站,繫結型別選擇https,在ssl證書中下拉選擇前面匯入的證書即可

image-20210929163339899

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即可。

相關文章