本文的封面图由ChatGPT的4o模型生成。

可参阅MSYS2官方文档

在MSYS2环境中,我们可能需要安装证书。比如,安全软件可能会在系统中安装根证书以解密HTTPS流量,而这些证书默认不会被MSYS2信任,会导致使用curl等工具时出现SSL相关异常。

由于没有安装安全软件的自签名证书,MSYS2中执行`curl`时出现SSL相关异常

分步操作

  1. 导出证书:对于已经安装的证书,我们可以直接打开certmgr.msc,找到对应的证书。其一般位于「受信任的根证书颁发机构」下。右键点击此证书,选择「所有任务」 -> 「导出」,选择DER编码二进制X.509 (.CER)格式导出。

  2. 复制证书:将证书复制到MSYS2的/etc/pki/ca-trust/source/anchors/目录下。

  3. 更新证书:在MSYS2中执行以下命令:

    1
    update-ca-trust

    这样,MSYS2就会更新证书链,包含了我们刚刚添加的证书。

自动操作

对于可能会时常更新的证书,我们可以使用脚本自动化操作。以下是一个简单的PowerShell脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 检查是否具有管理员权限
function Test-Admin {
$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object System.Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
}

# 如果没有管理员权限,则提权
if (-not (Test-Admin)) {
Write-Host "没有管理员权限,正在请求提权..."
Start-Process -FilePath "powershell.exe" -ArgumentList "-File `"$PSCommandPath`"" -Verb RunAs
exit
}

# 提权后执行的操作
Write-Host "管理员权限确认,继续执行操作..."

# 设置变量
$msys2Path = "C:\msys64" # MSYS2 的安装路径
$certificateName = "Kaspersky Anti-Virus Personal Root Certificate" # 证书名称
$certificateFileName = "kaspersky-root-cert.cer" # 证书文件名
$certificateFilePath = "$msys2Path\etc\pki\ca-trust\source\anchors\$certificateFileName" # 证书文件路径

# 获取指定名称的证书
$rootCert = Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object { $_.Subject -like "*$certificateName*" }

if ($rootCert) {
Write-Host "找到证书,开始导出..."
# 导出证书到文件
$rootCertBytes = $rootCert.Export('Cert')
[System.IO.File]::WriteAllBytes($certificateFilePath, $rootCertBytes)
Write-Host "证书已成功导出到: $certificateFilePath"
} else {
Write-Host "未找到指定的证书: $certificateName"
exit
}

# 刷新 MSYS2 证书存储
Write-Host "刷新 MSYS2 证书存储..."
& "$msys2Path\msys2_shell.cmd" -msys2 -c "update-ca-trust"
Write-Host "证书刷新完成!"

$msys2Path$certificateName$certificateFileName等变量需要根据实际情况修改。

脚本的工作流程与上述的分步操作相同,不过添加了提权过程,确保能够将证书文件写入MSYS2的安装目录。