-
응용 프로그램 패키지 서명 인증서 만들기Etc. 2018. 3. 20. 21:41
(WPF 인증서, Visual Studio에서 사용하는 인증서, RSA 인증서)
먼저 본인 컴퓨터에 설치된 인증서들을 확인하는 방법입니다.
실행창(win + R) -> certmgr.msc 실행
저는 WPF를 ClickOnce 배포할 때, 어셈블리에 서명할 때 사용하지만, 기타 다른 개발시에도 코드 서명은 필요합니다.
본래는 VeriSign 같은 곳에서 인증서를 구매해야 하지만, 공부용, 돈을 주고 사야할 정도의 규모, 용도가 아닌 경우 등등
돈을 투자하여 사기에는 애매한 경우가 있습니다.
그럴 때에 VeriSign 같은 신뢰 가능한 CA(Certificate Authority 네이버 백과)가 아닌 스스로 발급하는 방법이 있습니다.
신뢰할 수 있는 CA는 아니지만, 인증서를 사용하는 법을 확인할 수 있고,
ClickOnce배포 시 이상한 인증서가 아니라 본인의 인증서를 사용할 수 있게 됩니다.
Visual Studio에서 자체적으로 인증서를 만들 수 있습니다. 하지만 만료일이 1년 뒤로 고정되어 있고 연장이 되지 않아서
만료된 뒤에 처리가 복잡해 집니다. 그래서 다른 프로그램으로 5년, 10년 등 길게 만들기도 합니다.
인증서를 만들 때에 이전에, 최근에도 MakeCert를 자주 사용하시는 듯 하지만,
MSDN에 보면 MakeCert는 사용하지 말라고 권장합니다. (이는 makecert가 sha1을 기본적으로 사용해서 인 것 같습니다.)
그래서 최근 MS Docs에 가보면 New-SelfSignedCertificate 라는 것을 사용합니다.
이는 PowerShell을 통해 사용 가능하며, MS Docs에 설명이 나와있습니다. (패키지 서명용 인증서 만들기)
하지만 설명이 뭔가 부족하기에 제가 이해한 대로 사용법을 씁니다.
현재는 New-SelfSignedCertificate (정보)를 사용합니다.
정보 링크에 들어가보면 여러 Argument들 설명, 사용 예시가 나옵니다.
저는 Code Sign을 목적으로 사용하였기에 Code Sign을 예시로 들겠습니다.
우선 PowerShell을 실행해야 합니다.
PowerShell은 Windows 7 이후 모든 Windows에 기본적으로 설치되어 제공된다고 합니다.
시작(Win) 키를 눌러주신 후 PowerShell을 검색하여 실행해 주세요.
혹시 PowerShell 업데이트가 필요하시다면 링크 에 가셔서 설치해 주세요.
이제 New-SelfSignedCertificate를 사용하면 됩니다.
먼저 가장 간단한 예시 입니다.
PS C:\> New-SelfSignedCertificate -DnsName "gigong.cf" -CertStoreLocation "cert:\LocalMachine\My"
gigong.cf라는 도메인의 SSL 자체 인증서를 만드는 예시 입니다.
실제 코드 서명에 사용될 예시 입니다.
PS C:\> New-SelfSignedCertificate -Type Custom -Subject "CN=발급받을 이름"
-TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3","2.5.29.17={text}email=이메일")
-KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048
-CertStoreLocation "Cert:\CurrentUser\My"
-NotAfter (Get-Date).AddYears(5)
(가독성을 위해 여러줄로 나누었습니다. 한줄로 쓰시면 됩니다.)
New-SelfSignedCertificate로 Custom 타입 인증서를
기본으로 설정된 공급자인 Microsoft Software Key Storage Provider를 통해 발급받는 인증서 입니다.
Subject의 CN은 인증서에 표시될 이름입니다.
TextExtension은 이 인증서가 사용될 용도의 자세한 내용을 표시합니다.
2.5.29.37 은 사용 용도를 나타냅니다.
용도는 아래와 같이 나뉩니다.
-- Client Authentication. 1.3.6.1.5.5.7.3.2
-- Server Authentication. 1.3.6.1.5.5.7.3.1
-- Secure Email. 1.3.6.1.5.5.7.3.4
-- Code Signing. 1.3.6.1.5.5.7.3.3
-- Timestamp Signing. 1.3.6.1.5.5.7.3.8여러 용도를 사용할 경우 2.5.29.37={text}oid,oid… 의 형식으로 써주면 됩니다.
예시) 클라이언트 인증, 코드 사인 => "2.5.29.37={text}1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.3"
2.5.29.17 은 발급받는 자의 추가 정보를 나타냅니다.
내용은 아래와 같이 추가할 수 있습니다.
-- UPN. A user principal name in the following format: admin@contoso.com
-- Email. An email address, such as this example: admin@contoso.com
-- DNS. A computer name in the following format: computer.contoso.com
-- DirectoryName. CN=Name,DC=Domain,DC=com
-- URL. The URL of a host, such as this example: http://computer07.contoso.com/index.html
-- IPAddress. An IP address
-- RegisteredID. ID in dotted decimal notation, such as this example: 1.2.3.4.5
-- GUID. A globally unique ID, such as this example: f7c3ac41-b8ce-4fb4-aa58-3d1dc0e36b39
여러 내용을 추가할 경우 2.5.29.17={text}token=value&token=value… 의 형식으로 써주면 됩니다.
예시) Email과 UPN 추가 => "2.5.29.17={text}email=gigong222@gmail.com&upn=gigong222@gmail.com"
UPN 은 보안 담당자 라고 합니다.
KeyUsage 는 키가 사용될 용도를 나타냅니다.
아래와 같은 용도들이 있습니다. 따로 설정하지 않으면 None이 됩니다.
-- CertSign
-- CRLSign
-- DataEncipherment
-- DecipherOnly
-- DigitalSiganture
-- EncipherOnly
-- KeyAgreement
-- KeyEncipherment
-- None (default)
-- NonRepudiation
KeyAlgorithm 은 키를 생성할 때에 적용되는 알고리즘을 정합니다.
RSA와 Elliptic Curve Digital Signature Algorithms(ECDSA)를 사용할 수 있습니다.
KeyLength : RSA 를 사용할 경우 bit단위의 키 길이를 정해주어야 합니다.
최근에는 1024보다 작은 길이는 사용하지 않으며 2048을 권장합니다. (마이크로소프트 보안공지)
위 예시에는 나오지 않았지만 ECDSA를 사용할 경우의 예시입니다.
-KeyAlgorithm ECDSA_nistP256 -CurveExport CurveName (ECDSA_타원이름 의 형태로 씁니다.)
CurveExport : ECDSA를 사용할 때 키를 Export 할 경우 타원 방정식의 어떤 정보를 내보낼 것인지 정하는 것입니다.
권장은 CurveName 인 것 같습니다. (저도 ECDSA는 사용해보지 않아서 확실치 않습니다....ㅠ)
CertStoreLocation 은 만든 인증서가 저장될 공간입니다.
Cert:\CurrentUser\My을 예시로 설명해 드리겠습니다.
Cert:\ 라는 인증서를 보관하는 장소가 따로 있습니다. 그곳에서 CurrentUser 보관소가 있습니다.
그곳의 My 보관소에 저장하는 것입니다.
NotAfter 는 인증서의 만료일을 정합니다. 따로 정하지 않을 경우 1년이 기본값이며
매개변수가 System.DateTime 형으로 와야 하기 때문에 임의로 만들기가 힘듭니다.
그래서 PowerShell의 Get-Date함수를 사용하여 DateTime형을 불러오고,
AddYears(), AddMonths() 등을 사용하여 만료일을 정합니다.
설명을 하나하나 쓰다보니 정말 전달인자가 많은데요... 이보다도 더 많은 매개변수들이 있으니
더 알아보실 분들께서는 New-SelfSignedCertificate (정보) 에 가시면 모든 정보가 있습니다.
위에 쓰여진 예시를 그대로 실행해 보았습니다.
저장된 폴더인 cert:\\CurrentUser\My에 들어가서 확인해 보았습니다.
잘 생성된 것을 확인할 수 있습니다.
그리고 테스트 한 인증서를 지울 때에는 인증서가 있는 폴더(cert:\\CurrentUser\My)에서
rm 지울인증서의 Thumbprint 를 하시면 됩니다.
예시) rm 00123456789123456...
이제 이 인증서를 다른 곳에서 혹은 파일을 통해 사용하기 위해서는 따로 파일로 내보내야 합니다.
하지만...
글이 생각보다 너무 길어져서 인증서를 pfx파일로 내보내는 법은 다음 글에 이어서 쓰겠습니다...
'Etc.' 카테고리의 다른 글
정보처리기사 업무 프로세스 용어 정리 (0) 2018.04.14 인증서를 PFX파일로 내보내기 (4) 2018.03.21 Git Remote 분기 로컬과 일치시키기 (0) 2018.02.27 윈도우 버전 별 기본 설치 .NET Framework 버전 (0) 2018.01.08 이클립스 설치 (Eclipse Oxygen) (0) 2017.09.15 댓글