# 自定义证书（Custom Certificates）

> 在 Proxyman 中添加自定义根证书、服务器证书和客户端证书，用于 SSL Pinning 和双向 TLS，并生成 Apple 信任的自签名根证书。

## 1. 这是什么？ {#1-whats-it}

Proxyman 支持自定义 **Root Certificate**（根证书）、**Server Certificate**（服务器证书）和 **Client Certificate**（客户端证书）。你可以添加自己的证书，Proxyman 会使用这些证书在客户端、服务器和 Proxyman 应用之间建立 SSL 连接。

| 自定义证书类型         | 用途                                                                                              | Proxyman 的使用方式                                       |
| ---------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| **Server Certificate** | 用于拦截使用 SSL Pinning 的客户端的 HTTPS 流量                                                    | 用此证书与你的客户端完成 SSL 握手                         |
| **Client Certificate** | 用于拦截使用双向认证（Mutual Authentication）的客户端的 HTTPS 流量                                | 用此证书与特定服务器完成 SSL 握手                         |
| **Root Certificate**   | 用于在不使用本地 Proxyman 证书的情况下，拦截客户端和服务器的 HTTPS 流量                           | 与客户端和服务器完成 SSL 握手                             |

![Proxyman 自定义证书窗口，位于 Root Certificate 标签页，Proxyman CA 证书状态为 Installed &#x26; Trusted](https://proxyman.com/docs/assets/proxyman-custom-root-certificate.jpg)

_Root Certificate 标签页_

> **备注:** Proxyman 根证书在你的 Mac 上本地生成。你也可以自行生成根证书并添加到 Proxyman 中。请参阅[如何生成自签名根证书](https://proxyman.com/docs/zh-cn/advanced-features/custom-certificates#6-how-to-generate-self-signed-certificates-for-custom-root-certificate-that-comply-with-new-apples-security-requirements)。

## 2. 证书格式 {#2-certificate-formats}

Proxyman 支持以下格式：

| 自定义证书 | PEM 或 DER | PKCS #12 (p12) |
| ---------- | ---------- | -------------- |
| 根证书     | 不支持     | 支持           |
| 客户端证书 | 支持       | 支持           |
| 服务器证书 | 支持       | 支持           |

* PKCS #12（p12）文件。
* PEM 或 DER 格式的私钥和证书文件。

> **备注:**
>
> - Proxyman 会自动识别私钥和证书文件的格式（PEM 或 DER）。
> - 导入加密的私钥或 PKCS #12 文件时，Proxyman 会要求输入密码。
> - 所有口令都会安全地存储在 Proxyman Keychain 中。

> **备注:** 如果你的证书格式不受 Proxyman 支持，请在导入前将其转换为 p12 或 PEM/DER 格式。

## 3. macOS 10.15+ 和 iOS 13+ 上的证书要求 {#3-certificate-requirement-on-macos-1015-and-ios-13}

如果你在 macOS 10.15 或更高版本，或 iOS 13 或更高版本上使用自定义根证书或服务器证书，除非证书满足以下要求，否则 Safari 或 iOS 设备上的 SSL 握手可能会失败：

* RSA 密钥的长度必须为 2048 位或以上
* 哈希算法必须属于 SHA-2 系列
* 服务器的 DNS 名称必须位于 Subject Alternative Name（SAN）中，Common Name（CN）已不再被信任
* 证书必须在有效期内（当前日期需介于 Not Before 与 Not After 之间）
* TLS 服务器证书必须包含 ExtendedKeyUsage（EKU）扩展，且其中包含 **id-kp-serverAuth** OID。

延伸阅读：[iOS 13 和 macOS 10.15 中受信任证书的要求](https://support.apple.com/en-us/HT210176)

> **备注:** 如果觉得这些步骤太复杂，可以让 Proxyman 代为完成。打开 **Certificate** 菜单 -> **Install Certificate on this Mac…**，然后选择 **Automatic** 标签页。

## 4. 常见问题 {#4-common-issues}

| 问题                                     | 解决方法                                                                                                                                                                                                                                                                                                 |
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 私钥与证书不匹配                         | 尝试其他证书和私钥，并确认两者相互匹配                                                                                                                                                                                                                                                                   |
| 自定义证书出现 SSL 握手错误              | <ul><li>尝试将自定义证书添加到 System Keychain 并信任它</li><li>证书不满足 macOS 的要求 => 请阅读 [第 3 节](https://proxyman.com/docs/zh-cn/advanced-features/custom-certificates#3-certificate-requirement-on-macos-1015-and-ios-13)</li><li>检查证书的有效期</li></ul> |
| 因口令无效而无法导入证书                 | 向团队负责人索取正确的口令，以打开加密的私钥或 P12 文件                                                                                                                                                                                                                                                  |

## 5. 使用方法 {#5-how-to-use}

* 打开 **Certificate** 菜单 -> **Add Custom Certificates…**

## 6. 如何生成符合 Apple 新安全要求的自签名自定义根证书 {#6-how-to-generate-self-signed-certificates-for-custom-root-certificate-that-comply-with-new-apples-security-requirements}

由于 [Apple 针对 iOS 13 和 macOS Catalina (10.15) 的要求](https://proxyman.com/docs/zh-cn/advanced-features/custom-certificates#3-certificate-requirement-on-macos-1015-and-ios-13)，你需要进行一些额外配置，才能生成可正常使用的自签名证书。

请按照以下步骤操作：

1. 在 **Desktop**（桌面）文件夹中创建 `cert.config` 文件

```
[ ca ]
default_ca    = CA_default
[ CA_default ]
default_md    = sha256
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
keyUsage=critical,keyCertSign
extendedKeyUsage = serverAuth,clientAuth
[ req ]
prompt = no
distinguished_name    = req_distinguished_name
[ req_distinguished_name ]
C=US
L=US
O=Proxyman LLC
CN=proxyman.dev
OU=Proxyman
```

* 更新 C、L、O、CN 和 OU 参数的值。

2\. 在 Terminal 应用中生成 RSA 密钥。（将 **your\_password** 替换为任意密码，例如 123456）

```bash
cd ~/Desktop
openssl genrsa -aes256 -passout pass:your_password -out key.pem 2048
```

3\. 生成自签名证书和私钥。（将 **your\_password** 替换为第 2 步中设置的密码）

```
openssl req -x509 -new -nodes -passin pass:your_password -config cert.config -key key.pem -sha256 -extensions v3_ca -days 825 -out root-ca.pem
```

4\. 转换为 p12 格式。（将 **your\_password** 替换为第 2 步中设置的密码）

```
openssl pkcs12 -export -legacy -out root-ca.p12 -in root-ca.pem -inkey key.pem -passin pass:your_password -passout pass:your_password
```

5\. 此时你已获得 **root-ca.p12** 文件，请继续下一步。

> **备注:** 如果你在 macOS 14（OpenSSL v3）或更高版本上无法导入自定义证书，请在第 4 步中使用 \`-legacy\` 参数。
>
> 参考资料：[PKCS12 导入时出现 MAC verification failed（Stack Overflow）](https://stackoverflow.com/questions/70431528/mac-verification-failed-during-pkcs12-import-wrong-password-azure-devops)

## 7. 作为自定义根证书导入 {#7-import-as-a-custom-root-certificate}

1. 打开 **Certificate** 菜单 -> **Add Custom Certificates…**，然后选择 **Root Certificate** 标签页
2. 点击 **Import** 按钮 -> **Import P12...**
3. 选择 **root-ca.p12** 文件，并输入密码。
4. 在 Keychain Access（钥匙串访问）应用中信任你的自定义证书：

* 打开 Keychain Access 应用
* 搜索你添加的证书。证书名称可能是其 Common Name（CN）
* 双击打开证书，然后选择 **Always Trust**
* 关闭窗口以保存更改

![macOS Keychain Access 证书窗口，信任设置为 Always Trust](https://proxyman.com/docs/assets/Screen%20Shot%202020-09-09%20at%2006.30.51.png)

5\. 确认出现绿色对勾，表示证书已安装并受信任。

## 8. 作为服务器/客户端证书导入 {#8-import-as-a-serverclient-certificate}

对于自定义服务器证书或客户端证书，请勿生成自签名证书。请向同事或团队负责人索取公司使用的证书，格式可以是 DER/PEM 或 P12。

然后在自定义证书窗口的 **Server Certificates** 或 **Client Certificates** 标签页中导入该证书。

![Proxyman 证书导入面板，已选择 PEM 证书文件和私钥文件](https://proxyman.com/docs/assets/Screen%20Shot%202020-06-26%20at%2010.54.35.png)

> **备注:** 由于它不是根证书，因此无需在 System Keychain 中信任该证书。

## 了解更多 {#learn-more}

* [如何在 Proxyman 中生成和使用自定义根证书](https://proxyman.com/posts/2020-09-09-Generate-Self-Signed-Certificate-iOS13-Mac-Catalina)
