PKI(공개 키 기반 구조)에 익숙한 대부분의 Windows 관리자라면 자체 서명된 인증서를 생성할 수 있는 MakeCert.exe 도구를 알고 있을 것입니다. 이 도구는 Microsoft .NET Framework SDK 및 Microsoft Windows SDK에 포함되어 있습니다. 하지만 최신 Windows 버전(Windows 10/8.1, Windows Server 2019/2016/2012R2)에서는 별도의 도구 없이도 PowerShell에 내장된 New-SelfSignedCertificate cmdlet을 사용하여 자체 서명 인증서를 만들 수 있습니다.
New-SelfSignedCertificate PowerShell Cmdlet으로 자체 서명 인증서 만들기
PowerShell로 자체 서명 인증서를 만들려면 PoSh PKI(Public Key Infrastructure) 모듈에 포함된 New-SelfSignedCertificate cmdlet을 사용하면 됩니다.
PKI 모듈에서 사용 가능한 모든 cmdlet 목록을 확인하려면 다음 명령을 실행합니다.
Get-Command -Module PKI
자체 서명 인증서는 테스트 목적이나, PKI/CA 인프라를 구축할 수 없거나 외부 공급업체에서 신뢰할 수 있는 인증서를 구매할 수 없는 경우 사내 인트라넷 서비스(IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess 등)용 인증서를 제공할 때 사용하는 것이 좋습니다.
팁: Let's Encrypt에서 무료 SSL 인증서를 손쉽게 발급받을 수 있다는 점도 잊지 마세요. Windows Server에서 Let's Encrypt SSL 인증서를 발급하고 IIS 사이트에 바인딩하는 방법도 참고해 보세요.
인증서를 생성하려면 -DnsName(서버 이름, localhost 이름과 달라도 되는 임의의 이름)과 -CertStoreLocation(생성된 인증서가 저장될 로컬 인증서 저장소) 값을 지정해야 합니다. 이 cmdlet은 Windows 10(이 예시), Windows 8.1, Windows Server 2019/2016/2012 R2/2012에서 자체 서명 인증서를 만드는 데 사용할 수 있습니다.
DNS 이름 test.contoso.com에 대한 새 SSL 인증서(기본 SSLServerAuthentication 유형)를 생성하고 컴퓨터의 개인 인증서 저장소에 추가하려면 다음 명령을 실행합니다. (FQDN 이름을 사용하세요.)
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\My
Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\My Thumbprint Subject ---------- ------- 2175A76B10F843676951965F52A718F635FFA043 CN=test.contoso.com
관리자 권한이 없는 PowerShell 세션(로컬 관리자 권한 없이)에서 이 명령을 실행하면 다음과 같은 오류가 발생합니다.
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
또한 -KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider" 매개변수처럼 비표준 암호화 공급자(CSP)를 지정한 경우, 해당 공급자가 컴퓨터에 설치되어 있는지 확인해야 합니다(기본값은 Microsoft Enhanced Cryptographic Provider CSP). 그렇지 않으면 다음 오류가 나타납니다.
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).
이 명령은 새 인증서를 생성하여 컴퓨터의 개인 인증서 저장소로 가져옵니다. certlm.msc MMC 스냅인을 열어 새 인증서가 인증서 저장소의 개인(Personal) 섹션에 표시되는지 확인하세요.
기본 자체 서명 인증서의 설정값
기본적으로 생성되는 자체 서명 인증서의 설정은 다음과 같습니다.
- 암호화 알고리즘: RSA
- 키 길이: 2048비트
- 허용되는 키 용도: 클라이언트 인증(Client Authentication) 및 서버 인증(Server Authentication)
- 인증서 사용 범위: 디지털 서명(Digital Signature), 키 암호화(Key Encipherment)
- 인증서 유효 기간: 1년
인증서 속성을 보면 이 인증서가 클라이언트 인증에 사용될 수 있을 뿐만 아니라 서버 인증에도 유효하다는 것을 알 수 있습니다.
Get-ChildItem cmdlet을 사용하면 Thumbprint로 생성된 인증서의 모든 매개변수를 표시할 수 있습니다.
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *
PSPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My\2175A76B10F843676951965F52A718F635FFA043
PSParentPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My
PSChildName : 2175A76B10F843676951965F52A718F635FFA043
PSDrive : Cert
PSProvider : Microsoft.PowerShell.Security\Certificate
PSIsContainer : False
EnhancedKeyUsageList : {Client Authentication (1.3.6.1.5.5.7.3.2), Server Authentication (1.3.6.1.5.5.7.3.1)}
DnsNameList : {test.contoso.com}
SendAsTrustedIssuer : False
Archived : False
FriendlyName :
NotAfter : 05/11/2021 06:19:42
NotBefore : 05/11/2020 05:59:42
HasPrivateKey : True
SerialNumber : 6797F5E3F870478D4D3798BEB291DBF3
Thumbprint : 2175A76B10F843676951965F52A718F635FFA043
Version : 3
Issuer : CN=test.contoso.com
Subject : CN=test.contoso.com참고: 이렇게 생성된 자체 서명 인증서는 생성일로부터 1년 후 만료됩니다. -NotAfter 옵션을 사용하면 다른 유효 기간을 설정할 수 있습니다. 예를 들어 다음 명령으로 유효 기간이 3년인 SSL/TLS 인증서를 발급할 수 있습니다.
$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $3years -CertStoreLocation cert:\LocalMachine\My
인증서 체인 생성하기
인증서 체인을 만들 수도 있습니다. 먼저 루트 인증서(CA)를 생성한 후, 이를 기반으로 SSL 서버 인증서를 발급합니다.
$rootCert = New-SelfSignedCertificate -Subject 'CN=TestRootCA,O=TestRootCA,OU=TestRootCA' -KeyExportPolicy Exportable -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -Provider 'Microsoft Enhanced RSA and AES Cryptographic Provider'
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature
인증서 내보내기 (PFX 및 CER)
생성된 인증서를 개인 키와 함께 암호로 보호되는 PFX 파일로 내보내려면 해당 인증서의 Thumbprint를 지정해야 합니다. Thumbprint는 New-SelfSignedCertificate 명령 실행 결과에서 복사할 수 있습니다. 인증서 보안 암호를 지정하고 SecureString 형식으로 변환해야 합니다.
$CertPassword = ConvertTo-SecureString -String "YourPassword" -Force -AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPassword
인증서의 공개 키는 다음과 같이 내보낼 수 있습니다.
Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cer
지정한 디렉터리에 *.cer(PFX) 인증서 파일이 생성되었는지 확인하세요. 해당 파일을 마우스 오른쪽 버튼으로 클릭하고 인증서 설치(Install Certificate) 메뉴를 선택하면 인증서 가져오기 마법사를 사용하여 컴퓨터의 신뢰할 수 있는 루트 인증서에 인증서를 추가할 수 있습니다.
인증서 저장소 위치에서 로컬 컴퓨터(Local Machine)를 선택하고, '모든 인증서를 다음 저장소에 저장' 옵션에서 신뢰할 수 있는 루트 인증 기관(Trusted Root Certification Authorities)을 선택합니다.
다음 명령을 사용하면 인증서를 생성하면서 동시에 컴퓨터의 신뢰할 수 있는 루트 인증서 저장소로 가져올 수 있습니다.
$SelfSignCert=New-SelfSignedCertificate .....
$certFile = Export-Certificate -Cert $SelfSignCert -FilePath C:\ps\export-certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
이 공개 키 또는 인증서 파일 자체는 GPO를 사용하여 Active Directory 도메인의 모든 컴퓨터와 서버에 배포할 수 있습니다.
SAN(주체 대체 이름)이 포함된 자체 서명 인증서 만들기
New-SelfSignedCertificate cmdlet의 유용한 기능 중 하나는 여러 개의 서로 다른 이름, 즉 SAN(Subject Alternative Names)이 포함된 인증서를 만들 수 있다는 점입니다.
참고: MakeCert.exe 도구는 New-SelfSignedCertificate cmdlet과 달리 SAN 및 와일드카드 인증서를 생성할 수 없습니다.
여러 이름이 포함된 인증서를 만들 때는 DnsName 매개변수의 첫 번째 이름이 인증서의 CN(일반 이름)으로 사용됩니다. 예를 들어 다음 이름으로 자체 서명 SAN 인증서를 만들어 보겠습니다.
- 주체 이름(CN): adfs1.contoso.com
- 주체 대체 이름(DNS): web_gw.contoso.com
- 주체 대체 이름(DNS): enterprise_reg.contoso.com
인증서 생성 명령은 다음과 같습니다.
New-SelfSignedCertificate -DnsName adfs1.contoso.com,web_gw.contoso.com,enterprise_reg.contoso.com -CertStoreLocation cert:\LocalMachine\My
또한 전체 도메인 네임스페이스에 대한 와일드카드 인증서를 생성할 수도 있습니다. 이 경우 서버 이름으로 *.contoso.com을 지정하면 됩니다.
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname *.contoso.com
Windows에서 코드 서명용 자체 서명 인증서 생성하기
PowerShell 3.0의 New-SelfSignedCertificate cmdlet은 SSL 인증서만 생성하며, MakeCert 유틸리티로 생성한 인증서와 달리 드라이버, 애플리케이션 또는 스크립트 코드 서명에는 사용할 수 없습니다.
PowerShell 5.0 이상 버전에서는 새 버전의 New-SelfSignedCertificate cmdlet을 사용하여 코드 서명(Code Signing) 인증서를 발급할 수 있습니다.
자체 서명된 애플리케이션 코드 서명 인증서를 만들려면 다음 명령을 실행합니다.
$cert = New-SelfSignedCertificate -Subject "My Code Signing Certificate" -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My
이제 이 자체 서명 인증서로 PowerShell 스크립트에 서명할 수 있습니다.
Set-AuthenticodeSignature -FilePath C:\PS\my_posh_script.ps1 -Certificate $cert
명령 실행 시 UnknownError 경고가 표시된다면, 인증서가 사용자의 개인 인증서 저장소에 있어 신뢰되지 않기 때문입니다.
이 경우 인증서를 신뢰할 수 있는 루트 인증서 저장소로 이동해야 합니다. (Windows 인증서 루트 저장소를 주기적으로 검사하여 신뢰할 수 없거나 의심스러운 인증서를 확인하고 신뢰할 수 있는 루트 인증서 목록을 업데이트하는 것도 잊지 마세요.)
Move-Item -Path $cert.PSPath -Destination "Cert:\CurrentUser\Root"
이후 이 자체 서명 인증서로 PowerShell 스크립트에 서명할 수 있습니다.
Windows Server IIS에서 SHA-256 자체 서명 SSL 인증서 사용하기
IIS(인터넷 정보 서비스) 관리자 콘솔에서 자체 서명 인증서 만들기(Create Self-Signed Certificate) 작업 메뉴를 통해 IIS용 자체 서명 인증서를 생성하면 SHA-1 암호화 알고리즘으로 SSL 인증서가 생성됩니다. 이러한 인증서는 많은 브라우저에서 신뢰할 수 없는 것으로 간주되며 보안 연결을 설정하는 데 사용할 수 없습니다(또는 다른 SSL 오류가 표시될 수 있습니다). New-SelfSignedCertificate cmdlet을 사용하면 더 널리 사용되는 SHA-256 암호화 알고리즘 기반의 인증서를 만들 수 있습니다.
PowerShell로 생성한 SHA-256 자체 서명 인증서를 Windows Server의 IIS 사이트에 바인딩할 수 있습니다. PowerShell을 사용하여 SSL 인증서를 만들고 컴퓨터의 인증서 저장소에 넣으면 IIS 사이트에서 자동으로 사용할 수 있게 됩니다.
IIS 관리자 콘솔을 시작하고 사이트를 선택한 다음, 사이트 바인딩(Site Binding) 옵션에서 생성한 인증서를 선택하고 변경 사항을 저장하면 됩니다.