비대칭키를 이용한 인증서 생성 - (2) 인증서에 대하여

단비·2023년 5월 9일
1

학습

목록 보기
40/66

X.509

  • 공개 키 인증방식의 형식을 정의하는 표준
  • HTTPS의 기초가 되는 TLS/SSL을 포함한 많은 인터넷 프로토콜에서 사용

인증서
디지털 서명으로 내용 변경과 위장 행위를 검출하고, 부인을 방지할 수 있음


인증서의 표준 규격

  1. 버전(Verion Number)

    • 인증서의 버전
  2. 시리얼 번호(Serial Number)

    • CA가 할당한 정수로 된 고유 번호
    • CRL에서는 이 번호로 폐지한 인증서를 구별
  3. 서명 알고리즘(Signature Algorithm ID)

    • 인증기관이 사용한 서명 알고리즘
  4. 발행자(Issuer Name)

    • 인증서를 발행한 인증기관의 이름
    • Name(DN) 형식으로 기술됨
      (사용자는 이 발행자와 시리얼 번호로 인증서를 구별)
  5. 유효기간(Validaty period)

    • Not Before, Not After
    • 개시시각, 종료시각이 연 월 일 시 분 초 단위로 되어 있음(TIME형식)
  6. 서브젝트 이름(Subject name)

    • 소유자의 이름
  7. 서브젝트 공개키 정보(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)의 계층적 표현

  1. C: Country name (나라)
  2. O: Organization (회사, 조직, 기관)
  3. OU: Organizational Unit (부서)
  4. CN: Common name (이름)




Certificate filename 확장자

.pem(Privacy-enhanced Electroonic Mail)

  • DER 인증서의 Base64 인코딩 값으로,
    "---BEGIN CERTIFICATE-"과 "-END CERTIFICATE---"사이에 위치

.cer, .crt, .der

  • 일반적으로 바이너리 DER 형식을 가지지만 Base64 인코딩된 인증서도 사용

.p7b, .p7c

  • certificate만 가지고 있는 파일

.p12

  • 하나 이상의 certificate, public, private keys를 포함하고 있는 아카이브파일

.pfx

  • p12의 전신






TSL/SSL 관련 작동 순서


RSA 암호화를 이용한 로그인

  1. 로그인 form 요청

  2. 서버에서는 공개키와 개인키를 생성
    (공개키는 클라이언트 단에 hidden처리해서 보이지 않게 하고(소스코드 보기로 확인할 수 있지만 암호화 되어 있다),
    개인키는 사용자의 요청 정보가 담긴 request 객체에 포함된 session에 저장)

  3. 사용자가 로그인 폼에 아이디 비밀번호를 입력하고 로그인 버튼을 누름

  4. 공개키를 이용해 사용자가 입력한 데이터를 암호화 하여 서버로 전송

  5. 서버는 전달받은 암호화된 평문을 세션에 저장해둔 개인키를 사용하여 복호화

  6. DB에 저장된 사용자 id와 pwd가 일치하는지 확인한다.



인증서 이용

Client는 String값을 가지고 있고,
Server는 클래스 자체를 가지고 있음

인증기관의 인증서(root, RSA + X509 암호화),
KeyPair 가져오기(root, RSA는 기본, 개인키 암호화O, 공개키는 암호화X 상태로 가져옴)

  1. UserKey 생성 (무작위 난수, RSA 암호화 방식만 적용) - Client

  2. 인증서 생성 (X509 암호화만 적용) - Server

    • 1번의 공개키(무작위 난수, X509 암호화 방식 추가) + 인증기관의 인증서(root 인증서) + 인증기관의 개인키(root key, RSA + PKCS8 암호화)를 이용해 인증서 생성

UserKey (KeyPair)
공개키 + 개인키
시그니처 키
원장정보 + 개인키


인증/검증 단계

인증서와 서명 데이터로 인증/검증

  1. 인증 시 원문 서명 데이터 생성 - Client

    • 무작위 난수 개인키(RSA 암호화)를 이용해 원장정보 서명
  2. Base64 기반 String으로 변환된 인증서를 X.509 암호화를 통해 인증서 재생성 - Server
    (생성이 되지 않을 경우 올바르지 않은 인증서, X509 암호화 데이터가 동일하지 않은 경우)

  3. 인증서 유효성 검사 - Server
    (유효기간이 만료된 인증서인지)

  4. 인증서의 무작위 난수 공개키(RSA + X509 암호화)로 초기화 후 원장정보(Byte[]) 업데이트 - Server

  5. 서명(Byte[]) 데이터로 검증 - Server






💡 TIPS!

1. 인증서가 유효한지 확인하는 방법

  • X509Certificate의 checkValidity 메소드를 활용 (리턴값: void)
X509Certificate cert = (X509Certificate)usrCert;
cert.checkValidity();

X509Certificate 정의서





참고 사이트

Certificate(인증서) - 개폰지밥

X.509 - JOINC

profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글