# 커스텀 인증서 (Custom Certificates)

> SSL 피닝과 상호 TLS 인증을 위해 Proxyman에 커스텀 루트, 서버, 클라이언트 인증서를 추가하고, Apple이 신뢰하는 자체 서명 루트 인증서를 생성하세요.

## 1. 무엇인가요? {#1-whats-it}

Proxyman은 커스텀 **루트 인증서**, **서버 인증서**, **클라이언트 인증서**를 지원합니다. 인증서를 직접 추가하면, Proxyman은 이를 사용해 클라이언트, 서버, Proxyman 앱 사이의 SSL 연결을 설정합니다.

| 커스텀 인증서 유형 | 용도 | Proxyman의 사용 방식 |
| --- | --- | --- |
| **서버 인증서** | SSL 피닝을 사용하는 클라이언트의 HTTPS 트래픽을 가로채기 위한 용도 | 클라이언트와의 SSL 핸드셰이크에 이 인증서를 사용 |
| **클라이언트 인증서** | 상호 인증(Mutual Authentication)을 사용하는 클라이언트의 HTTPS 트래픽을 가로채기 위한 용도 | 특정 서버와의 SSL 핸드셰이크에 이 인증서를 사용 |
| **루트 인증서** | Proxyman의 로컬 인증서를 사용하지 않고 클라이언트와 서버의 HTTPS 트래픽을 가로채기 위한 용도 | 클라이언트와 서버 양쪽의 SSL 핸드셰이크 |

![Root Certificate 탭이 열려 있고 Proxyman CA 인증서가 설치 및 신뢰된 상태인 Proxyman Custom Certificates 창](https://proxyman.com/docs/assets/proxyman-custom-root-certificate.jpg)

_Root Certificate 탭_

> **노트:** Proxyman 루트 인증서는 Mac에서 로컬로 생성됩니다. 직접 루트 인증서를 생성해 Proxyman에 추가할 수도 있습니다. [자체 서명 루트 인증서를 생성하는 방법](https://proxyman.com/docs/ko/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 서버 인증서에는 **id-kp-serverAuth** OID가 포함된 ExtendedKeyUsage (EKU) 확장이 있어야 합니다.

자세히 보기: [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/ko/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}

[iOS 13 및 macOS Catalina (10.15)의 Apple 요구 사항](https://proxyman.com/docs/ko/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\` 플래그를 사용하세요.
>
> 참고: [MAC verification failed during PKCS12 import (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**를 선택합니다
* 창을 닫아 변경 사항을 저장합니다

![Trust가 Always Trust로 설정된 macOS Keychain Access 인증서 창](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 형식일 수 있습니다.

그런 다음 Custom Certificates 창의 **Server Certificates** 또는 **Client Certificates** 탭에서 가져오세요.

![PEM 인증서 파일과 개인 키 파일이 선택된 Proxyman Certificate Importer 시트](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)
