기존 서버에 붙어 있는 SSL 인증서를 다른 서버로 옮겨야 한다. 인증서 파일과 개인키를 각각 구하려다 보면 개인키를 못 꺼내 결국 재발급을 받는 일이 생긴다.
인증서를 옮긴다는 말은 인증서 · 개인키 · 중간 CA 체인 셋을 함께 옮긴다는 뜻이다. 셋을 한 파일로 묶은 형식이 PKCS#12 이고, 윈도우에서는 .pfx 확장자를 쓴다. 공개 인증서만 담는 .cer 를 옮겨서는 서버가 TLS 핸드셰이크를 못 한다.
IIS 관리자를 열고 좌측 트리에서 서버 노드를 고른 뒤 가운데의 서버 인증서 를 연다. 대상 인증서를 고르고 우측 작업 창의 내보내기 를 누른다. 저장 경로와 암호를 지정하면 .pfx 가 만들어진다. 이 암호는 가져올 때 반드시 필요하다.
IIS 의 내보내기 대화상자에는 체인 포함 여부 같은 세부 선택지가 없다. 체인까지 확실히 담으려면 인증서 스냅인(certlm.msc)에서 인증서를 우클릭해 모든 작업 → 내보내기 를 고르고, 개인 키 내보내기 를 예로, 가능한 경우 인증 경로의 모든 인증서 포함 을 체크한다.
가져오기는 대칭이다. 새 서버의 IIS 관리자에서 서버 인증서 → 가져오기 를 고르고 .pfx 와 암호를 넣는다. 그다음 사이트의 바인딩 에서 443 포트 항목을 만들고 방금 가져온 인증서를 선택해야 실제로 쓰인다. 가져오기만 하고 바인딩을 안 걸면 아무 일도 일어나지 않는다.
스크립트로 돌릴 때는 다음 두 명령이면 된다.
$pw = ConvertTo-SecureString -String $env:PFX_PASSWORD -Force -AsPlainText
# 내보내기 — 지문은 certlm.msc 또는 Get-ChildItem 으로 확인한다
Get-ChildItem -Path Cert:\LocalMachine\My |
Select-Object Subject, Thumbprint, NotAfter
Export-PfxCertificate -Cert Cert:\LocalMachine\My\<지문> `
-FilePath C:\temp\site.pfx -Password $pw -ChainOption BuildChain
# 가져오기
Import-PfxCertificate -FilePath C:\temp\site.pfx `
-CertStoreLocation Cert:\LocalMachine\My -Password $pw
바인딩까지 한 번에 건다.
Import-Module WebAdministration
New-WebBinding -Name 'Default Web Site' -Protocol https -Port 443 -HostHeader 'www.example.com' -SslFlags 1
$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -like '*www.example.com*' }
New-Item -Path "IIS:\SslBindings\!443!www.example.com" -Value $cert -SSLFlags 1
발급 시점에 개인키를 내보낼 수 없게 표시했으면 내보내기 버튼이 눌리지 않는다. 이때는 옮기는 대신 새 서버에서 CSR 을 만들어 재발급받는 것이 정상 절차다. 키를 강제로 꺼내는 우회는 키 보호 정책을 무력화하는 행위이므로 쓰지 않는다.
CSR 은 IIS 관리자의 인증서 요청 만들기 또는 다음으로 만든다.
certreq -new request.inf request.csr
받는 쪽이 Apache · nginx 라면 .pfx 를 분해해야 한다.
openssl pkcs12 -in site.pfx -nocerts -nodes -out site.key
openssl pkcs12 -in site.pfx -clcerts -nokeys -out site.crt
openssl pkcs12 -in site.pfx -cacerts -nokeys -chain -out chain.crt
-nodes 는 개인키의 암호를 푼다. 서비스 계정이 자동 기동해야 하므로 보통 이렇게 두고, 대신 파일 권한을 600 으로 좁힌다.
옮긴 뒤에는 실제 포트에서 무엇이 제시되는지 본다.
openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts </dev/null
체인이 빠지면 브라우저는 통과해도 자바 클라이언트나 curl 이 실패한다. 중간 CA 가 함께 제시되는지 반드시 확인한다.
.pfx 는 개인키를 담고 있으므로 파일 자체가 자격증명이다. 메일이나 공유 폴더로 주고받지 않고, 옮긴 뒤에는 원본을 지운다.
만료일은 옮겨도 늘지 않는다. 이전 서버에서 곧 만료될 인증서를 옮겨 봐야 며칠 뒤 같은 작업을 다시 해야 한다.