X.509
- 공개 키 인증방식의 형식을 정의하는 표준
- HTTPS의 기초가 되는 TLS/SSL을 포함한 많은 인터넷 프로토콜에서 사용
인증서
디지털 서명으로 내용 변경과 위장 행위를 검출하고, 부인을 방지할 수 있음
인증서의 표준 규격
-
버전(Verion Number)
-
시리얼 번호(Serial Number)
- CA가 할당한 정수로 된 고유 번호
- CRL에서는 이 번호로 폐지한 인증서를 구별
-
서명 알고리즘(Signature Algorithm ID)
-
발행자(Issuer Name)
- 인증서를 발행한 인증기관의 이름
- Name(DN) 형식으로 기술됨
(사용자는 이 발행자와 시리얼 번호로 인증서를 구별)
-
유효기간(Validaty period)
- Not Before, Not After
- 개시시각, 종료시각이 연 월 일 시 분 초 단위로 되어 있음(TIME형식)
-
서브젝트 이름(Subject name)
-
서브젝트 공개키 정보(Subject Public Key Info)
- Public Key Algorithm, Subject Public Key
- 소유자의 공개키로 이용할 수 있는 알고리즘
(소유자의 공개키가 RSA 알고리즘용의 공개키인 경우, 알고리즘 이름은 RSAEncryption이 됨
알고리즘 이름의 기술에는 Algorithm형이 사용)
인증서 폐지
- 이용자가 개인 키를 분실 혹은 도난 당했거나 퇴직이나 이름이 바뀐 경우에 인증서 폐지(revoke)가 필요함
CRL (certificate revocation list)
인증서 폐지 목록,
폐지된 인증서의 일련번호의 목록에 대해 인증기관이 디지털 서명을 붙인 것
DN과 General Name
- 인증기관의 공개 키는 어떻게 하면 바르다 라고 판단할 수 있을까?
인증기관의 공개 키에 대해 다른 인증기관이 디지털 서명을 하는 것으로 인증기관의 공개 키를 검증할 수 있음
즉, 인증기관의 공개 키 인증서를 생성하는 것
DN (Distinguished Name)
인증서의 본인명(subject), 발행자명 (issuer)의 계층적 표현
- C: Country name (나라)
- O: Organization (회사, 조직, 기관)
- OU: Organizational Unit (부서)
- CN: Common name (이름)
Certificate filename 확장자
.pem(Privacy-enhanced Electroonic Mail)
- DER 인증서의 Base64 인코딩 값으로,
"---BEGIN CERTIFICATE-"과 "-END CERTIFICATE---"사이에 위치
.cer, .crt, .der
- 일반적으로 바이너리 DER 형식을 가지지만 Base64 인코딩된 인증서도 사용
.p7b, .p7c
.p12
- 하나 이상의 certificate, public, private keys를 포함하고 있는 아카이브파일
.pfx
TSL/SSL 관련 작동 순서
-
로그인 form 요청
-
서버에서는 공개키와 개인키를 생성
(공개키는 클라이언트 단에 hidden처리해서 보이지 않게 하고(소스코드 보기로 확인할 수 있지만 암호화 되어 있다),
개인키는 사용자의 요청 정보가 담긴 request 객체에 포함된 session에 저장)
-
사용자가 로그인 폼에 아이디 비밀번호를 입력하고 로그인 버튼을 누름
-
공개키를 이용해 사용자가 입력한 데이터를 암호화 하여 서버로 전송
-
서버는 전달받은 암호화된 평문을 세션에 저장해둔 개인키를 사용하여 복호화
-
DB에 저장된 사용자 id와 pwd가 일치하는지 확인한다.
인증서 이용
Client는 String값을 가지고 있고,
Server는 클래스 자체를 가지고 있음
인증기관의 인증서(root, RSA + X509 암호화),
KeyPair 가져오기(root, RSA는 기본, 개인키 암호화O, 공개키는 암호화X 상태로 가져옴)
-
UserKey 생성 (무작위 난수, RSA 암호화 방식만 적용) - Client
-
인증서 생성 (X509 암호화만 적용) - Server
- 1번의 공개키(무작위 난수, X509 암호화 방식 추가) + 인증기관의 인증서(root 인증서) + 인증기관의 개인키(root key, RSA + PKCS8 암호화)를 이용해 인증서 생성
UserKey (KeyPair)
공개키 + 개인키
시그니처 키
원장정보 + 개인키
인증/검증 단계
인증서와 서명 데이터로 인증/검증
-
인증 시 원문 서명 데이터 생성 - Client
- 무작위 난수 개인키(RSA 암호화)를 이용해 원장정보 서명
-
Base64 기반 String으로 변환된 인증서를 X.509 암호화를 통해 인증서 재생성 - Server
(생성이 되지 않을 경우 올바르지 않은 인증서, X509 암호화 데이터가 동일하지 않은 경우)
-
인증서 유효성 검사 - Server
(유효기간이 만료된 인증서인지)
-
인증서의 무작위 난수 공개키(RSA + X509 암호화)로 초기화 후 원장정보(Byte[]) 업데이트 - Server
-
서명(Byte[]) 데이터로 검증 - Server
💡 TIPS!
1. 인증서가 유효한지 확인하는 방법
- X509Certificate의 checkValidity 메소드를 활용 (리턴값: void)
X509Certificate cert = (X509Certificate)usrCert;
cert.checkValidity();
X509Certificate 정의서
참고 사이트
Certificate(인증서) - 개폰지밥
X.509 - JOINC