반응형

공동 인증서(구 공인인증서)에서 주체키기관키는 암호학적인 공공키 기반 구조(PKI, Public Key Infrastructure)에서 중요한 역할을 합니다. 이 두 키의 관계는 다음과 같습니다


#1. 주체키와 기관키 정의

  1. 주체키 (Subject Key):
    • 주체키는 인증서의 주체, 즉 인증서 소유자(개인 또는 기업)가 보유한 개인키(Private Key)와 공개키(Public Key)를 의미합니다.
    • 인증서 소유자는 개인키를 비밀로 유지하며, 공개키는 인증서에 포함되어 누구나 접근할 수 있습니다.
    • 주체키는 주로 전자서명, 데이터 암호화/복호화 등에 사용됩니다.
    • 공개키와 개인키는 쌍으로 이루어져 있으며, 개인키로 서명한 데이터를 공개키로 검증할 수 있습니다.
  2. 기관키 (CA 키, Certificate Authority Key):
    • 인증 기관(CA, Certificate Authority)은 인증서를 발급하는 기관으로, 기관키는 해당 기관이 사용하는 개인키공개키를 의미합니다.
    • 인증 기관의 공개키는 누구나 접근할 수 있으며, 이를 통해 인증 기관이 발급한 인증서를 검증할 수 있습니다.
    • 인증 기관의 개인키는 비밀로 유지되며, 이 키를 사용하여 인증서에 서명합니다. 즉, 인증 기관이 발급하는 인증서는 CA의 개인키로 서명되어 있으며, 누구나 CA의 공개키로 이 서명을 검증할 수 있습니다.

관계 요약:

  • 주체키는 인증서 소유자의 공개키/개인키 쌍을 의미하고, 기관키는 인증서를 발급하는 CA의 공개키/개인키 쌍을 의미합니다.
  • 인증서를 사용할 때, 인증서에 포함된 주체의 공개키는 인증 기관의 서명(기관의 개인키로 서명됨)을 통해 신뢰성을 검증받습니다. 즉, 기관키는 주체키의 유효성을 검증하는 역할을 하며, 이 과정에서 인증 기관이 신뢰할 수 있는지를 보장해 줍니다.

이런 구조를 통해 PKI는 전자서명과 인증서의 신뢰성을 유지하며, 안전한 통신 환경을 제공합니다.


#2. 체인 검증

공동인증서에서 주체키기관키는 신뢰할 수 있는 인증 체계(PKI)를 통해 검증됩니다. 이 과정에서 체인 검증(Certificate Chain Validation)이 이루어지며, 주체키의 유효성과 신뢰성을 인증하는 중요한 단계입니다. 이 체인 검증은 다음과 같은 절차를 따릅니다.

1. 인증서 체인의 개념

  • 인증서 체인은 여러 인증 기관(CA)의 인증서가 계층적으로 연결된 구조입니다. 일반적으로 **루트 인증서(CA)**부터 **중간 인증서(CA)**를 거쳐 **최종 사용자 인증서(End-entity Certificate)**까지 이어집니다.
  • 최종 사용자 인증서는 공동인증서 소유자의 인증서(즉, 주체의 인증서)이며, 상위 기관의 서명을 통해 신뢰성을 얻습니다.

2. 체인 검증의 과정

인증서 체인 검증은 주체의 인증서가 신뢰할 수 있는 기관에 의해 발급되었는지 확인하는 절차입니다. 이는 다음 단계로 이루어집니다:

1) 주체 인증서 검증

  • 주체 인증서는 공동인증서 소유자의 공개키를 포함하며, 상위 CA의 개인키로 서명되어 있습니다.
  • 인증서 검증 과정에서, 주체 인증서의 서명이 올바른지, 즉 상위 CA의 공개키로 서명을 검증합니다.
  • 이 상위 CA의 공개키는 중간 인증서에 포함되어 있습니다.

2) 중간 인증서 검증

  • 상위 CA가 여러 단계일 경우, 중간 인증서가 존재합니다.
  • 중간 CA의 인증서는 상위 인증 기관(CA)에 의해 발급되었으며, 상위 CA의 개인키로 서명되어 있습니다.
  • 중간 CA의 인증서 서명도 상위 CA의 공개키로 검증됩니다.

3) 루트 인증서 검증

  • 체인의 최상단에는 루트 CA 인증서가 있습니다.
  • 루트 인증서는 자체 서명(self-signed)된 인증서로, 일반적으로 신뢰할 수 있는 기관에 의해 미리 신뢰 목록에 포함되어 있습니다.
  • 이 루트 인증서는 더 이상 상위 인증서가 필요하지 않고, 운영체제(OS)나 브라우저에서 사전에 신뢰할 수 있는 루트 인증서 목록에 포함됩니다.

4) CRL과 OCSP 확인

  • 인증서 체인 검증의 마지막 단계에서, 각 인증서가 폐지되지 않았는지 확인하는 절차가 있습니다.
  • 이를 위해 CRL(인증서 폐지 목록, Certificate Revocation List) 또는 OCSP(온라인 인증서 상태 프로토콜, Online Certificate Status Protocol)를 사용하여 인증서의 상태를 확인합니다.
  • 만약 주체 인증서 또는 중간 인증서가 폐지된 경우, 인증서 체인 검증은 실패합니다.

3. 체인 검증 요약

  • 주체키(즉, 주체의 공개키)는 상위 CA에 의해 서명된 주체 인증서를 통해 신뢰성을 가집니다.
  • 주체 인증서는 중간 인증서의 서명을 확인하고, 중간 인증서는 루트 인증서의 서명을 확인합니다.
  • 루트 인증서는 신뢰할 수 있는 기관이 직접 신뢰하는 인증서이며, 이를 통해 전체 체인의 신뢰성이 보장됩니다.
  • 체인 검증 과정에서 각 인증서의 유효성(서명 검증, 폐지 여부 등)을 확인하여, 해당 인증서가 올바르게 사용되고 있는지 확인합니다.

체인 검증 흐름 요약

  1. 주체 인증서 → 중간 CA 인증서 → 루트 CA 인증서 순으로 상위 인증 기관이 서명한 내용을 확인합니다.
  2. 각 단계에서 상위 기관의 공개키로 하위 인증서의 서명을 검증합니다.
  3. 루트 인증서가 신뢰되는 루트 저장소에 있는지 확인합니다.
  4. 각 인증서가 폐지되지 않았는지 CRL 또는 OCSP로 확인합니다.

이를 통해 최종적으로 주체 인증서(공동인증서)가 신뢰할 수 있는 인증 기관에 의해 발급되었음을 확인하게 됩니다.

반응형

'Development > Security' 카테고리의 다른 글

[Security] 공인인증  (0) 2020.04.12
[Security] 대칭키 암복호화  (0) 2019.09.22
[Security] Proguard 사용시 파일 목록과 내용  (0) 2019.09.22
[Security] Base64 정리  (0) 2019.09.09
[Security] 전자서명  (0) 2019.09.05
반응형

#. NPKI (National Public Key Infrastructure) : 국가 공개키 기반 구조

 

#. CA (Certificate Authority) 

- 인증 기관 

- 5대 인증 기관(코스콤, 한국전자인증, 한국정보인증, 금융결제원, 한국무역정보통신)

 

[출처] 한국전자인증(https://www.crosscert.com/solution/03_1_02.jsp)

 

 

#. RA (Registration Authority) 

- 등록 기관 

- 공인인증서의 접수 및 등록 등의 일을 수행

- 은행, 증권회사, 인증기관(한국전자인증, 한국정보인증)

- 사용자 인증서 관리(등록, 재등록,정보 수정, 정보 삭제, 정보 조회)

- 공인인증서 관리(효력정지, 효력회복, 폐지)

 

#. PKI (Public Key Infrastructure)

 

# OCSP (Online Certificate Status Protocol)

- 온라인 인증서 상태조회 프로토콜

- CRL을 통한 검증 메커니즘

- 사용자의 실수 또는 고의로 폐기된 인증서가 사용되는 것을 방지하기 위해 CA를 통해 발급된 인증서의 유효성(폐기) 여부를 실시간 검증하여 폐지 및 정지된 인증서에 대한 정보를 실시간으로 제공하는 서비스

- 인증서가 유효한지 1분마다 체크

 

[출처] 한국전자인증(https://www.crosscert.com/solution/03_1_05.jsp)

 

 

# CRL (Certificate Revocation List)

- 인증서 폐기목록 리스트

- 인증서가 유효한지 12~48시간 마다 체크

 

# LDAP

- 조직이나 개체 그리고 인터넷이나 기업 내의 인트라넷 등 네트워크 상에 있는 파일이나 장치들과 같은 자원 등의 위치를 찾을 수 있게 해주는 프로토콜

 

#. 인증의 3요소 (암기시 .부.인)

- 무결성, 부인방지, 인증

반응형
반응형

이번 포스팅은 대칭키 암복호화 중 가장 많이 사용하는 AES 알고리즘 암복호화에 대하여 알아보도록 하겠습니다.

 

1. 암호화

public byte[] Encrypt(String text, String key) throws Exception {

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

byte[] keyBytes= new byte[16];

byte[] b= key.getBytes("UTF-8");

 

int len= b.length;

if (len > keyBytes.length) len = keyBytes.length;

System.arraycopy(b, 0, keyBytes, 0, len);

 

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);

cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);

 

byte[] results = cipher.doFinal(text.getBytes("UTF-8"))

return result;

}

 

2. 복호화

public String Decrypt(String text, String key) throws Exception {

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

byte[] keyBytes= new byte[16];

byte[] b= key.getBytes("UTF-8");

int len= b.length;

if (len > keyBytes.length) len = keyBytes.length;

                    

System.arraycopy(b, 0, keyBytes, 0, len);

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);

byte [] results =cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);

        return results;

 }              

반응형

+ Recent posts