2017-03-06 1 views
0

을 작성해야합니다. 따라서 CRL과 인증서를 전달할 수있는 방법이 있습니다. 내 응용 프로그램의 런타임 중에 공급 업체에서 오는 인증서의 유효성을 검사하는 데 사용했습니다.X509 인증서 단위 테스트 - 인증서가있는 CRL과

가장 힘든 부분은 단위 테스트입니다.

인증서 파일과 CRL 파일을 만들어야하는데,이 파일을 응용 프로그램과 함께 리소스로 배포 한 다음 유닛 테스트 중에 전달해야합니다.

내가 단위 테스트도 작성하지만, 하드 코딩 값이 -하지만 지금은 다음과 만드는 방법을 알고 있어야합니다

이 X509 인증서. 하나의 CRL

두 개의 X509 인증서 중 하나에 대한 항목이 있어야 CRL이 필요합니다. 이를 통해 해지 결과 및 무효화 여부를 테스트 할 수 있습니다.

나는 아래의 가이드를 시도했지만 보안은 나의 장점과는 거리가 멀다. 그리고 나는 그것을 작동시킬 수 없다.

https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/ 
+0

스택 오버플로는 프로그래밍 및 개발 관련 질문에 대한 사이트입니다. 이 질문은 프로그래밍이나 개발에 관한 것이 아니기 때문에 주제와는 거리가 먼 것처럼 보입니다. 도움말 센터에서 [여기에서 내가 질문 할 수있는 항목은 무엇입니까?] (http://stackoverflow.com/help/on-topic)를 참조하십시오. 아마도 [Super User] (http://superuser.com/) 나 [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/)가 더 나은 곳이 될 것입니다. 또한 [Dev Ops에 대한 질문은 어디에 게시합니까?] (http://meta.stackexchange.com/q/134306) – jww

+0

[인증 기관의 인증서 서명 요청에 서명하는 방법] (http : // stackoverflow .com/a/21340898/608639) 및 [openssl을 사용하여 자체 서명 된 인증서를 만드는 방법?] (http://stackoverflow.com/q/10175812/608639) – jww

답변

0

제이미 구엔은 여기에서 찾을 수 있습니다 인증서 및 CRL을, 인증 기관을 작성하고 실행에 큰 가이드가 있습니다 https://jamielinux.com/docs/openssl-certificate-authority/이 내가 당신의 질문에 대답하면서 참조 느슨하게 될 것입니다 것입니다. 이 명령들의 출력이 어떻게 될지 궁금한 점이 있다면, 나는 그의 사이트를 참조한다. 이미 관리가 용이 ​​한이 게시물을 유지하기 위해 여기서는 생략되었습니다.

  • 두 잎 인증서
  • 에 서명 인증 기관
  • 사용으로 CA 인증서를 행동 자체 서명 된 인증서를 만들기의
  • 해지 하나

    기본적으로 우리는 다음을 수행해야합니다 잎 인증서

  • 은 자기 기호를 만들기 CRL

게시 ed CA Certificate

먼저 CA 구성을 준비해야합니다.

# OpenSSL root CA configuration file. 

[ ca ] 
default_ca = ca_default 

[ ca_default ] 
dir    = /etc/pki/CA 
certs    = $dir/certs 
crl_dir   = $dir/crl 
new_certs_dir  = $dir/newcerts 
database   = $dir/db/root-ca.index 
serial   = $dir/db/root-ca.serial 
RANDFILE   = $dir/private/.rand 
private_key  = $dir/private/root-ca.key 
certificate  = $dir/certs/root-ca.crt 
crlnumber   = $dir/db/root-ca.crlnumber 
crl    = $dir/crl/root-ca.crl 
crl_extensions = crl_ext 
default_crl_days = 180 
default_md  = sha384 
name_opt   = ca_default 
cert_opt   = ca_default 
default_days  = 375 
preserve   = no 
policy   = policy_loose 

[ policy_strict ] 
countryName    = match 
stateOrProvinceName  = match 
organizationName  = match 
organizationalUnitName = optional 
commonName    = supplied 
emailAddress   = optional 

[ policy_loose ] 
countryName    = optional 
stateOrProvinceName  = optional 
localityName   = optional 
organizationName  = optional 
organizationalUnitName = optional 
commonName    = supplied 
emailAddress   = optional 

[ req ] 
default_bits  = 3072 
distinguished_name = req_distinguished_name 
string_mask   = utf8only 
default_md   = sha384 
x509_extensions  = int_ca 

[ req_distinguished_name ] 
countryName      = Country Name (2 letter code) 
stateOrProvinceName    = State or Province Name 
localityName     = Locality Name 
0.organizationName    = Organization Name 
organizationalUnitName   = Organizational Unit Name 
commonName      = Common Name 
emailAddress     = Email Address 
countryName_default    = US 
stateOrProvinceName_default  = MD 
localityName_default   = 
0.organizationName_default  = LAB 
organizationalUnitName_default = 
emailAddress_default   = 

[ root_ca ] 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid:always,issuer 
basicConstraints = critical, CA:true 
keyUsage = critical, digitalSignature, cRLSign, keyCertSign 

[ usr_cert ] 
basicConstraints = CA:FALSE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid,issuer 
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment 
extendedKeyUsage = clientAuth, emailProtection 
crlDistributionPoints = URI:http://pki.lab.local/int-ca.crl 
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt 

[ server_cert ] 
basicConstraints = CA:FALSE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid,issuer:always 
keyUsage = critical, digitalSignature, keyEncipherment 
extendedKeyUsage = serverAuth 
crlDistributionPoints = URI:http://pki.lab.local/int-ca.crl 
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt 

[ crl_ext ] 
authorityKeyIdentifier=keyid:always 
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt 

이이 openssl.cnf로 작업 디렉토리에 배치해야합니다 : 당신은 자신의 튜토리얼을 통해 이동하지 않으려면, 당신은 단순히 다음과 같은 다소 단축 설정을 사용할 수 있습니다.

dir = /etc/pki/CA 행을 수정할 디렉토리를 지정하고 CDP를 통해 해지 확인을 사용하려면 CDP URL을 실제 도메인을 가리 키도록 변경해야합니다.

다음으로 CA가 예상하는 파일과 디렉토리를 만든 다음 CA 인증서 용 RSA 개인 키를 생성해야합니다. 참고 : CA 개인 키는 암호로 보호됩니다.

mkdir db private certs crl newcerts csr & touch db/root-ca.index 
echo 1000 > db/root-ca.serial & echo 1000 > db/root-ca.crlnumber 
openssl genrsa -aes256 -out private/root-ca.key 4096 

이제 새 개인 키를 사용하여 CA 인증서를 생성해야합니다.개인 키를 만들 때 입력 한 암호를 물어보고 국가, 주 및 일반 이름과 같은 일부 정보를 묻는 메시지가 나타납니다. 일반적인 이름 필드는 여기에서 중요하며이 테스트에서는 단지 Test Root CA을 넣습니다. 명령이 성공적으로 완료되면

openssl req -config openssl.cnf -key private/root-ca.key \ 
    -new -x509 -days 3650 -sha256 -extensions root_ca \ 
    -out certs/root-ca.crt 

, 당신은 다음과 같은 명령으로 볼 수있는, certs/root-ca.crt에서 새 인증서를 볼 수 :

openssl x509 -in certs/root-ca.crt -noout -text 

잎 인증서 만들기

잎을 만들려면 인증서 (엔드 엔티티 인증서라고도 함)를 사용하면 각각에 대해 다른 개인 키를 생성해야합니다. test1test2이라고 부릅니다.

openssl genrsa -aes256 -out private/test1.key 4096 
openssl genrsa -aes256 -out private/test2.key 4096 

각각에 대해 CA가 실제 인증서를 생성하는 데 사용할 인증서 서명 요청 (CSR)을 생성합니다. CA 인증서를 만들 때와 비슷한 질문을하게됩니다. 일반적인 이름으로 Test 1Test 2을 사용할 수 있습니다.

openssl req -config openssl.cnf -key private/test1.key 
    -new -sha256 -out csr/test1.req 
openssl req -config openssl.cnf -key private/test2.key 
    -new -sha256 -out csr/test2.req 

이제 csr 디렉토리에 두 개의 인증서 요청이 있어야합니다. 우리는 이것을 사용하여 인증서를 생성합니다. 이러한 요청에 서명하려면 CA 개인 키 암호를 입력해야합니다.

openssl ca -config -in csr/test1.req -out certs/test1.crt \ 
    -extensions server_cert -days 365 -notext -md sha256 
openssl ca -config -in csr/test2.req -out certs/test2.crt \ 
    -extensions server_cert -days 365 -notext -md sha256 

이제 certs 디렉토리에 두 개의 새 잎사귀 인증서가 있어야합니다. 아래 명령을 사용하여 볼 수 있습니다. 인증서

을 해지

openssl x509 -in certs/test1.crt -noout -text 
openssl x509 -in certs/test2.crt -noout -text 

이제 재미있는 부분 온다. 인증서 취소 프로세스는 서명과 유사합니다. 우리는 CA 인증서와 개인 키를 사용하여 Test 2 잎을 취소합니다. 다음 명령에는 CA 개인 키 암호가 필요합니다. 당신이 궁금하다면

openssl ca -config opnessl.cnf -revoke certs/test2.crt 

,이 점은 일련 번호와 우리가 발급 한 인증서의 타임 스탬프를 기록했습니다까지 db/root-ca.index 파일은 이제 Test 2 옆에 두 번째 취소 타임 스탬프를 표시해야합니다. 일반적인 텍스트 파일입니다. CRL이 간단보기

openssl ca -config openssl.cnf -gencrl -out crl/root-ca.crl 

: 이제 다음 우리는 간단하게 할 CRL을 생성하기 위해 CRL

게시

(CA 개인 키 암호 필요). 아래 명령을 사용하면 일련 번호 Test 2에 대한 항목과 해지 된 타임 스탬프가 표시됩니다.인증서 취소 된을 확인하려면

openssl crl -in crl/root-ca.crl -noout -text 

는 다음 명령이 사용됩니다 취소의 인증서 상태를 반환해야이 사용

cat certs/root-ca.crt crl/root-ca.crl > crl/crl-chain.pem 
openssl verify -crl_check -CAfile crl/crl-chain.pem certs/test2.crt 

Test 2을 위해. Test 1에 대해 동일한 명령을 실행하면 확인이 반환됩니다.

랩까지

가정하면 모든 것이 제대로 일, 최종 결과는 다음과 같아야합니다

  • 한 CA 인증서
  • 한 좋은 잎 인증서
  • certs/test1.crt에서 certs/root-ca.crt에 취소 잎 인증서 in certs/test2.crt
  • 하나의 CRL i n crl/root-ca.crl

참고 1 : 이것은 Linux 시스템에서 OpenSSL을 사용한다고 가정합니다. 창문에 대한 안내가 필요하면 certutil을 제공 할 수 있습니다.

참고 2 : 본 가이드에는 질문과 직접적인 관련이없는 내용이 많이 생략되었습니다. 이 프로세스에 대한 자세한 내용을 보려면 상단에 게시 된 링크를 다시 참조하십시오.