借助mkcert簽發本地證書


mkcert 是由 Filippo Valsorda 使用go語言開源的一款零配置搭建本地證書服務的工具,它可以兼容Window, Linux, macOS等多種開發平台,省去了我們自簽本地證書的繁瑣步驟,從而讓我們專注於開發。

1. 安裝mkcert

1.1 Windows

Windows環境下,推薦使用Chocolatey包管理工具安裝mkcert,你可以選擇使用cmdpower shell安裝Chocolatey

以管理員權限打開cmd窗口,輸入以下命令進行安裝

1
@"%SystemRoot%System32WindowsPowerShellv1.0powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%chocolateybin"

以管理員權限打開power shell窗口,輸入以下命令進行安裝

1
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

Chocolatey安裝完成之后,命令行窗口輸入以下命令安裝mkcert

1
choco install mkcert

1.2 Linux

以下假定使用的是全新的Linux系統!

首先更新軟件源,防止E: Unable to locate package的錯誤,

1
sudo apt update

首先安裝證書數據庫工具certutil:

1
2
sudo apt install libnss3-tools // ubuntu
sudo yum install nss-tools // centos

然后,安裝包管理工具Linuxbrew:

1
2
sudo apt install linuxbrew-wrapper  // ubuntu
sudo yum install linuxbrew-wrapper // centos 待定

最后,使用brew安裝mkcert

1
brew install mkcert

tips:可能需要執行兩次命令,同時不要使用sudo命令,系統會提示你不要使用root權限來執行brew

mkcert安裝目錄下啟動mkcert,推薦將mkcert加入全局命令,

1
PATH=$PATH:/home/linuxbrew/.linuxbrew/Cellar/mkcert/1.2.0/bin

1.3 macOS

使用Homebrew安裝mkcert

1
2
brew install mkcert
brew install nss

2. 生成本地CA證書

2.1 生成根證書

mkcert安裝完成之后就可以使用mkcert命令生成本地CA證書了,非常簡單,傻瓜式安裝。

首先,生成根證書,一般在C:Users用戶名AppDataLocalmkcert目錄下會生成rootCA.pemrootCA-key.pem兩個文件。

根證書用來充當第三方證書簽發機構,類似於Symantec這種機構,為網站簽發CA證書。因為證書也可以偽造,所以瀏覽器需要驗證證書的有效性,證書有效之后才可以進行https連接,而第三方簽發機構提供證書的可信度驗證。

rootCA文件就是告訴瀏覽器我們自簽的證書是真實有效的,接下來我們簽發的本地證書都離不開rootCA

1
2
3
4
$ mkcert -install
Created a new local CA at "/Users/filippo/Library/Application Support/mkcert" 💥
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox trust store (requires restart)! 🦊

2.2 簽發本地證書

根證書生成之后就可以簽發本地證書了,命令超級簡單,唯一需要注意的就是生成的證書存放路徑就是命令的執行路徑。

1
2
3
4
5大專欄  借助mkcert簽發本地證書>
6
7
8
9
10
11
12
$ mkcert example.com "*.example.org" myapp.dev localhost 127.0.0.1 ::1
Using the local CA at "/Users/filippo/Library/Application Support/mkcert"

Created a new certificate valid for the following names 📜
- "example.com"
- "*.example.org"
- "myapp.dev"
- "localhost"
- "127.0.0.1"
- "::1"

The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem"

2.3 root stores

mkcert支持以下根存儲(mkcert supports the following root stores:):

  • macOS system store
  • Windows system store
  • Linux variants that provide either
    • update-ca-trust (Fedora, RHEL, CentOS) or
    • update-ca-certificates (Ubuntu, Debian) or
    • trust (Arch)
  • Firefox (macOS and Linux only)
  • Chrome and Chromium
  • Java (when JAVA_HOME is set)

這句話的意思就是說,mkcert會自動把證書加入系統認證,操作系統和瀏覽器可以直接識別。比如,證書安裝完成之后chrome的證書信任中心會增加以下內容:

2.4 node環境驗證

node不會使用root store,因此需要特殊對待,命令行手動設置NODE_EXTRA_CA_CERTS這個環境變量。

1
set NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"

** mkcert -CAROOT會輸出本地根證書的存儲路徑,可以使用環境變量$CAROOT來指定尋找證書的默認路徑。

使用node開啟https服務:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var https = require('https');
var fs = require('fs');

const hostname = '127.0.0.1';
const port = 3000;

var options = {
key : fs.readFileSync('c:/證書路徑'),
cert : fs.readFileSync('c:/證書路徑'),
}

const server = https.createServer(options ,(req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello Worldn');
});

server.listen(port, hostname, () => {
console.log(`Server running at https://${hostname}:${port}/`);
});

https進行訪問:

3. 分享

搞定了自己,接下來就要搞定別人,如何讓其它用戶也識別我們的本地證書呢?

mkcert同樣也給我們提供了可移植的解決方案。

將自簽證書(包括公鑰和私鑰)以及根證書的公鑰拷貝給其它用戶,修改$CAROOT環境變量,指定mkcert尋找根證書的路徑,

linux系統下:

1
export CAROOT="/home/..."

window系統下:

設置系統的環境變量,變量名為CAROOT

我的電腦->屬性->高級系統設置->環境變量

最后執行mkcert -install即可,控制台會提示,此時我們的自簽證書就可以在其它機器上運行了,根證書被導入到了瀏覽器的證書信任中心。

1
2
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox and/or Chrome/Chromium trust store (requires browser restart)! 🦊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM