X. 509, PKCS 파일 형식 소개

8831 단어 sslx509tlsopenssl
ASN. 1 - 데이터 구조 설명 언어
위 키 에서 인용:
ASN.1 is a standard
interface description language for defining
data structures that can be serialized and deserialized in a
cross-platform way.
즉, ASN. 1 은 데이터 구 조 를 정의 하 는 인터페이스 기술 언어 로 바 이 너 리 도 파일 형식 도 아 닙 니 다. 아래 의 예 를 보면 알 수 있 습 니 다.
FooQuestion ::= SEQUENCE {
    trackingNumber INTEGER,
    question       IA5String
}

이 코드 는 FooQuestion 의 데이터 구 조 를 정의 합 니 다. 다음은 FooQuestion 이라는 데이터 인터페이스의 구체 적 인 데이터 입 니 다.
myQuestion FooQuestion ::= SEQUENCE {
    trackingNumber     5,
    question           "Anybody there?"
}

ASN. 1 은 아래 에 설명 할 X. 509 와 PKCS group of cryptography standards 등 여러 곳 에 사 용 됩 니 다.
파일 인 코딩 형식
DER 인 코딩 형식
위 키 에서 인용:
ASN.1 is closely associated with a set of encoding rules that specify how to represent a data structure as a series of bytes
ASN. 1 은 데이터 구 조 를 바 이 너 리 로 표시 하 는 방법 을 규정 하 는 관련 인 코딩 규칙 이 있 습 니 다. DER 은 그 중의 하나 입 니 다.
위의 FooQuestion 의 예 를 DER 로 인 코딩 하면 (16 진수):
30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

번역 하면:
30 — type tag indicating SEQUENCE
13 — length in octets of value that follows
  02 — type tag indicating INTEGER
  01 — length in octets of value that follows
    05 — value (5)
  16 — type tag indicating IA5String 
     (IA5 means the full 7-bit ISO 646 set, including variants, 
      but is generally US-ASCII)
  0e — length in octets of value that follows
    41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f — value ("Anybody there?")

이곳 을 보면 DER 인 코딩 형식 에 대해 비교적 좋 은 인식 을 가지 게 될 것 이다.
PEM 인 코딩 형식
위 키 에서 인용:
Privacy-Enhanced Mail (PEM) is a de facto file format for storing and sending cryptographic keys, certificates, and other data, based on a set of 1993 IETF standards defining "privacy-enhanced mail."
PEM 은 암호학 key, 인증서 및 기타 데 이 터 를 저장 하고 전송 하 는 파일 형식의 사실 표준 입 니 다.ASN. 1 을 사용 하 는 많은 암호학 표준 (예 를 들 어 X. 509 와 PKCS) 은 DER 인 코딩 을 사용 하 는데 DER 인 코딩 의 내용 은 바 이 너 리 로 메 일과 전송 하기에 적합 하지 않 기 때문에 PEM 을 사용 하여 바 이 너 리 내용 을 ASCII 코드 로 변환 합 니 다.파일 내용 의 형식 은 다음 과 같 습 니 다:
-----BEGIN label-----
BASE64Encoded
-----END label-----

label 은 내용 이 어떤 유형 인지 구분 하 는 데 사 용 됩 니 다. 다음 에 말씀 드 리 겠 습 니 다.
PEM 과 관련 된 RFC 는 매우 많은 데 본 논문 의 내용 과 관련 된 것 은 RFC 7468 이다. 이 안에 많은 label 이 규정 되 어 있 지만 모든 label 에 대응 하 는 RFC 나 Specification 이 있 는 것 이 아니 라 이런 label 은 약 속 된 것 일 뿐이다.
PEM 은 실제로 DER 인 코딩 된 파일 의 바 이 너 리 내용 을 base 64 로 인 코딩 한 다음 -----BEGIN label----- 이러한 머리 와 -----END label----- 같은 끝 을 더 하고 중간 은 DER 파일 의 Base 64 인 코딩 이다.
우 리 는 아래 의 방법 을 통 해 이 결론 을 검증 할 수 있 습 니 다. 선생님 은 RSA Private Key 가 되 고 인 코딩 형식 은 PEM 형식 입 니 다.
openssl genrsa -out key.pem

파일 내용 을 살 펴 보면 label 은 RSA PRIVATE KEY:
-----BEGIN RSA PRIVATE KEY-----
BASE64Encoded
-----END RSA PRIVATE KEY-----

그리고 우 리 는 PEM 형식 을 DER 형식 으로 변환 합 니 다.
openssl rsa -in key.pem -outform der -out key.der

이 럴 때 파일 내용 을 보면 모두 바 이 너 리 라 는 것 을 알 수 있 을 것 이다.그리고 DER 파일 의 내용 Base 64 를 한 번 보면 PEM 파일 과 같은 내용 을 볼 수 있 습 니 다.
base64 -i key.der -o key.der.base64

인증서, 암호학 Key 형식
위 에서 말 한 PEM 은 인증서, 암호학 Key 파일 에 대한 인 코딩 방식 입 니 다. 다음은 이 인증서, 암호학 Key 파일 형식 을 예 로 들 어 보 겠 습 니 다.
X. 509 인증서
위 키 에서 인용:
In cryptography,
X.509 is a standard defining the format of public key certificates. X.509 certificates are used in many Internet protocols, including TLS/SSL, which is the basis for HTTPS, the secure protocol for browsing the web.
X. 509 는 Public Key Certificates 의 형식 표준 으로 TLS / SSL 이 사용 하고 TLS / SSL 은 HTTPS 의 기초 이기 때문에 HTTPS 도 사용 합 니 다.이른바 Public Key Certificates 는 Digital Certificate 또는 Identity Certificate 라 고도 부른다.
An X.509 certificate contains a public key and an identity (a hostname, or an organization, or an individual), and is either signed by a certificate authority or self-signed.
X. 509 Certificate 는 Public Key 와 신분 정 보 를 포함 하고 있 습 니 다. CA 에 의 해 서명 되 거나 직접 서명 되 었 습 니 다.
다음 그림 은 X. 509 Certificate 입 니 다.
사실 X. 509 Certificate 라 는 명 사 는 보통 IETF 의 PKIX Certificate 와 CRL Profile 을 가리 키 는데 RFC 5280 을 볼 수 있다.그래서 PKIX Certificate 라 는 글 자 를 봤 을 때 X. 509 Certificate 라 고 볼 수 있 습 니 다.
PKCS 시리즈
위 키 에서 인용:
In cryptography,
PKCS stands for "Public Key Cryptography Standards"
앞서 언급 한 X. 509 은 Public Key Certificates 의 포맷 을 정의 하 는 기준 으로 PKCS 와 비슷 해 보이 지만 실제로는 다르다. PKCS 는 Public Key 암호학 표준 이다.또한 Public - Key Cryptography 는 이름 이 Public Key 만 다 루 는 것 처럼 보이 지만 실제로는 Priviate Key 도 다 루 기 때문에 PKCS 도 Private Key 를 다 루 고 있다.
PKCS 에는 모두 15 개의 표준 번호 가 있 습 니 다. 여 기 는 PKCS \ # 1, PKCS \ # 8, PKCS \ # 12 만 선택 합 니 다.
PKCS #1
PKCS \ # 1, RSA Cryptography Standard, RSA Public Key 와 Private Key 수학 속성 과 형식 을 정 의 했 습 니 다. 자세 한 내용 은 RFC 8017 참조.
PKCS #8
PKCS \ # 8, Private - Key Information Syntax Standard, Private Certificate Keypairs (RSA 에 국한 되 지 않 음) 를 암호 화하 거나 비 암호 적 으로 저장 하 는 데 사 용 됩 니 다. 자세 한 내용 은 RFC 5858 참조.
PKCS #12
PKCS \ # 12 는 일반적으로 Private Keys 와 Public Key Certificates (예 를 들 어 앞에서 언급 한 X. 509) 를 저장 하 는 파일 형식 을 정의 하고 암호 기반 대칭 키 로 보호 합 니 다.상기 Private Keys 와 Public Key Certificates 는 복수 형식 입 니 다. 이 는 PKCS \ # 12 파일 이 실제 적 으로 Keystore 이 고 PKCS \ # 12 파일 은 자바 Key Store (JKS) 로 사용 할 수 있 음 을 의미 합 니 다. 자세 한 내용 은 RFC 7292 참조.
인증 서 를 자신의 CA 로 발급 했다 면 다음 명령 을 실행 하면 PKCS \ # 12 keystore 를 생 성 할 수 있 습 니 다.
openssl pkcs12 -export \
  -in  \
  -inkey  \
  -name my-cert \
  -caname my-ca-root \
  -CAfile  \
  -chain
  -out 

PKCS \ # 12 는 일반적으로 PEM 인 코딩 형식 을 내 보 내지 않 습 니 다.
PEM 형식 속사
PEM 파일 의 내용 이 어떤 형식 인지 모 르 면 아래 에 따라 조회 할 수 있 습 니 다.
X.509 Certificate
RFC7468 - Textual Encoding of Certificates
-----BEGIN CERTIFICATE-----
BASE64Encoded
-----END CERTIFICATE-----

X.509 Certificate Subject Public Key Info
RFC7468 - Textual Encoding of Subject Public Key Info
-----BEGIN PUBLIC KEY-----
BASE64Encoded
-----END PUBLIC KEY-----

PKCS #1 Private Key
RFC 나 권위 있 는 Specification 이 없 으 면 이 형식 은 때때로 전통 적 인 format, SSLeay format (SO 참조) 라 고 불 린 다.
-----BEGIN RSA PRIVATE KEY-----
BASE64Encoded
-----END RSA PRIVATE KEY-----

PKCS #1 Public Key
RFC 나 권위 가 없습니다. Specification
-----BEGIN RSA PUBLIC KEY-----
BASE64Encoded
-----END RSA PUBLIC KEY-----

PKCS #8 Unencrypted Private Key
RFC7468 - One Asymmetric Key and the Textual Encoding of PKCS #8 Private Key Info
-----BEGIN PRIVATE KEY-----
BASE64Encoded
-----END PRIVATE KEY-----

PKCS #8 Encrypted Private Key
RFC7468 - Textual Encoding of PKCS #8 Encrypted Private Key Info
-----BEGIN ENCRYPTED PRIVATE KEY-----
BASE64Encoded
-----END ENCRYPTED PRIVATE KEY-----

개인 키 조작 명령
생 성
PKCS \ # 1 형식의 RSA Private Key 생 성
openssl genrsa -out private-key.p1.pem 2048

바꾸다
PKCS #1 -> Unencrypted PKCS #8
openssl pkcs8 -topk8 -in private-key.p1.pem -out private-key.p8.pem -nocrypt

PKCS #1 -> Encrypted PKCS #8
openssl pkcs8 -topk8 -in private-key.p1.pem -out private-key.p8.pem

이 과정 에서 비밀 번 호 를 입력 하 게 될 것 입 니 다. 최소 4 자 를 입력 해 야 하기 때문에 PKCS \ # 8 은 PKCS \ # 1 보다 안전 합 니 다.
PKCS #8 -> PKCS #1
openssl rsa -in private-key.p8.pem -out private-key.p1.pem

이 PKCS \ # 8 이 암호 화 되 어 있다 면 비밀 번 호 를 입력 해 야 합 니 다.
Public Key 조작 명령
PKCS \ # 1 / \ # 8 에서 추출
추출 이란 Private Key 에서 Public Key 를 추출 하 는 것 을 말 합 니 다. openssl rsa PKCS \ # 1 과 PKCS \ # 8 을 동시에 지원 하 는 RSA Private Key 입 니 다. 유일한 차이 점 은 PKCS \ # 8 이 암호 화 되면 비밀 번 호 를 입력 하 라 는 것 입 니 다.
X. 509 형식 RSA 공개 키 추출
openssl rsa -in private-key.pem -pubout -out public-key.x509.pem

PKCS \ # 1 형식 추출 RSA 공용 키
openssl rsa -in private-key.pem -out public-key.p1.pem -RSAPublicKey_out

X. 509 인증서 에서 추출
openssl x509 -in cert.pem -pubkey -noout > public-key.x509.pem

바꾸다
X.509 RSA Public Key -> PKCS #1 RSA Public Key
openssl rsa -pubin -in public-key.x509.pem -RSAPublicKey_out -out public-key.p1.pem

PKCS #1 RSA Public Key -> X.509 RSA Public Key
openssl rsa -RSAPublicKey_in -in public-key.p1.pem -pubout -out public-key.x509.pem

참고 자료
  • OpenSSL Cookbook, OpenSSL 을 무료 로 소개 하 는 전자 책
  • PKCS \ # 1, PKCS \ # 8, X. 509, 형식 변환 의 예 를 많이 제공 합 니 다
  • 좋은 웹페이지 즐겨찾기