• Tidak ada hasil yang ditemukan

OpenSSL - Daum

N/A
N/A
Protected

Academic year: 2024

Membagikan "OpenSSL - Daum"

Copied!
47
0
0

Teks penuh

(1)OpenSSL Reference [1] http://www.openssl.org : OpenSSL 공식 홈 페이지 [2] http://www.modssl.org : mod_ssl 공식 홈 페이지 [3] http://home.xcert.com/~marcnarc//PKI/ : PKI 관련한 유용한 site [4] http://www2.psy.uq.edu.au/~ftp/Crypto/ssl.html : SSLeay programmer reference [5] http://developer.netscape.com/docs/manuals/security/sslin/contents.htm : Netscape SSL 소개 page [6] http://www.drh-consultancy.demon.co.uk/pkcs12faq.html#PFX : OpenSSL의 PKCS12 기능에 대한 설 명. [7] Introducing SSL and Certificates using SSLeay, (where???). l. SSLeay에서 유래 (Eric, A, Young)한 SSL(Secure Socket Layer)를 구현한 공개 소프 트웨어/라이브러리. l. SSLeay 는 SSLv2/v3 을 구현, SSLeay-0.9.0 이후 버전은 TLSv1구현.. l. OpenSSL : TLSv1 구현. l. Porting. u. n. Unix. n. DOS. n. Windows (WIN16, WIN32). n. VMS. n. Macintosh. n. Amiga. n. Palm Pilot. language n. C/C++. n. Java. n. Perl. n. Delphi. SSLeay는 원래 SSL을 구현하기 위한 목적으로 설계되었으며, 따라서 일반적인 암호화 기능 구현에는 잘 맞지 않는 경향이 있었으나, OpenSSL group등에서 꾸준한 version up을 거치는 과정에서 많은 기능 추가가 있었다. CA 관련 프로그램은 꾸준한 개선을 통해 다양한 형태의 인증서(PEM, DER, PKCS12, PKCS7, … )을 다룰 수 있으며, smime utility와 인증서 검증 기능 등이 지속적으로 추가되고 있다.. 1. (2) 개요 다음과 같은 파일을 포함한다. libssl.a: SSLv2, SSLv3, TLSv1을 지원하는 client와 server를 제작하는데 필요한 code들을 포함 libcrypto.a: X.509 v1/v3 인증서를 지원하는데 필요한 일반적인 암호 함수들과 SSL/TLS에 필요한 함수들 을 포함. 다음과 같은 함수群으로 구성된다.. Ciphers libdes. 4가지 모드의 DES 암호화 루틴, DESX, crypt() 함수를 포함.. RC4/RC2. 4 different modes, ecb, cbc, cfb and ofb.. Blowfish. 4 different modes, ecb, cbc, cfb and ofb.. IDEA. 4 different modes, ecb, cbc, cfb and ofb.. 메시지 다이제스트(Digests) l. MD5. l. MD2. l. SHA (SHA-0). l. SHA-1. 공개키 암호화(Public Key) l. RSA encryption/decryption/generation.. l. DSA encryption/decryption/generation.. l. Diffie-Hellman key-exchange/key generation.. X.509v3 인증서(certificates) l. X509 encoding/decoding into/from binary ASN1 and a PEM. l. The normal digital envelope routines and base64 encoding.. l. Higher level access to ciphers and digests by name.. l. New ciphers can be loaded at run time.. l. The BIO io system which is a simple non-blocking IO abstraction.. l. Current methods supported are file descriptors, sockets, socket accept, socket. Systems. connect, memory buffer, buffering, SSL client/server, file pointer, encryption, digest, non-blocking testing and null.. Data structures l. A dynamically growing hashing system. l. A simple stack.. 2. (3) l. openssl:. A Configuration loader that uses a format similar to MS .ini files.. command line tool: l. RSA, DH, DSA 키 생성. l. X.509 인증서, CSR, CRL의 생성. l. 메시지 다이제스트. l. 암호화/복호화. l. SSL/TLS 테스트, S/MIME 메일의 핸들링. OpenSSL Command line Program dgst. 메시지 다이제스트. enc. 메시지 암호화 및 base64 인코딩. ans1parse. 인증서와 같은 ASN.1 객체의 parsing.. dh. Diffle-Hellman 파라메터 관리. rsa. RSA 알고리즘 관련. crl. 인증서 취소 리스트 관리. x509. X509 인증서의 서명과 같은 작업을 수행. pkcs7. pkcs7 관련 명령. genrsa. RSA private key의 생성. gendsa. DSA private key를 생성한다.. dsaparam. DSA parameter를 생성한다. gendh. Diffle-Hellman 파라메터의 관리. req. PKCS#10 객체의 생성(CRS). s_client. SSL 클라이언트. s_server -. SSL 서버. s_time. SSL protocol timing program. s_mult. Another SSL server, but it multiplexes connections.. s_filter. under development. errstr. OpenSSL error numbers를 해당 스트링으로 변환한다.. ca. 인증서 신청서에 서명(인증서 생성)하고 CRL에 생성(인증서 취소)한다.. crl2pkcs7. 인증서와 CRL을 PKCS#7 타입으로 변환한다.. speed. 암호 알고리즘의 속도를 측정한다.. verify. 인증서와 인증서 체인(certificate chain)을 검증한다.. hashdir. under development. smime. 메시지를 mime 타입으로 변환 후 mime 메시지에 서명/암호화하여 S/MIME 메시지를 샹. 3. (4) 성한다. pkcs12. Pkcs12 타입의 객체를 생성하고 parsing한다. (pkcs12 == pfx). spkac. Netscape에서 사용하는 CSR format인 SPKAC를 지원한다.. 4. (5) 인증서/개인키 생성 인증서를 생성하기 위해 먼저 CSR(Certificate Signing Request)를 생성해야 한다. 또한 개인 키를 생성하기 위한 random number를 생성한다.. 1. 랜덤 넘버 생성 랜덤한 정보(information)을 전달하는 수단으로 랜덤한 수가 포함된 파일(rand.dat)가 필요하 다. head -25 * > rand.dat OR ssleay md5 * > rand.dat OR cat file1 file2 file3 > rand.dat. 2. 개인키 생성 openssl genrsa -rand rand.dat > key.pem -----BEGIN RSA PRIVATE KEY----MIIBPAIBAAJBAKubxA50T2q/cNY4Ma2lUqkw/S6bHv5kXOgyDsT2ZHziE6biLVHk n/ji0EZfFuQUeDaN+S2j0rkB0RIHh/YMcIkCAwEAAQJBAIBUdrPcdLs+OHJqCXRy ijMuCFd+9xmEEhotvO+71f+wk0d4euJKxEDqIkgKIvq1vYCj2pd8MJN1M6p0U1hA nMUCIQDSIpYLwxRctuG01aAG9do6BBEJh31hmLFJoQ9kts0TowIhANEQe4cNYFMo 8Jbgcwic+3B4wiGK271oQ78W37aoRE3jAiEAqOXrvGB8SVklaXgbO/z3/pGuL/6b JIraVNgDy2uywgkCIQCl1h9Gp9Oq46TE6dIWGQBS3VeQ5+caveRPZkObTqqv5QIg cQgxd12Rlhc3UqjnEd+yR8Xj8OSxykvFXkY0e1awiv4= -----END RSA PRIVATE KEY-----. 3. 패스프레이즈로 암호화된 개인키 생성 openssl genrsa -rand rand.dat -des 1024 > key.pem OR (if you want to use triple DES) openssl genrsa -rand rand.dat -des3 1024 > key.pem. [nrg:/] openssl genrsa -des > key.pem 1160 semi-random bytes loaded Generating RSA private key, 512 bit long modulus .....................+++++ .................+++++ e is 65537 (0x10001) Enter PEM pass phrase:. 5. (6) Verifying password - Enter PEM pass phrase: -----BEGIN RSA PRIVATE KEY----Proc-Type: 4,ENCRYPTED DEK-Info: DES-CBC,938DB4CEDEDA2B94. Le8anSjI9/grKxZ/NJ1f5PIYqnfXgu9tmBWK1e6r3avlj8qn7ylogj9q0V/Sepik KoINR2k116WRr2QWo8qCbVFtD6HzqX1W2CVlJj2KAcPvwLTFbEiQ21WbGU37ASNo +Y+4G2BOrhaAEDVvL1WlhX3HwqB5HYY9u9Gmr5XdSAr2WXFc1ewEl/EJLnl7RuQ9 CoyiXAQRly+FoPQiqbAXkiCOjsj3WItTCf6pZ7GEG+qpzCXLe4Ez4djCMZXPNmgN h40xN7KCCbke9ZnG+epDYsxTPH7b8KQOWWfXup0D/SPfhnJ7z97AaFpq1+jEE+Nj rd2tutOCLoYfmgOCiM2xx/s7bmdLsYw5Axnchy6rOgSa1TA030dOpPI74ZltEb4F kd5FRmMuo9ZfbS7kNMt+4KF6MdajO41qkdKB4IteTPE= -----END RSA PRIVATE KEY-----. 4. 개인키 파일에서 passphrase 제거 openssl rsa -in key1.pem -out key2.pem openssl rsa -in delthis.key -out delthis2.key read RSA private key Enter PEM pass phrase:passphrase writing RSA private key -----BEGIN RSA PRIVATE KEY----MIIBOgIBAAJBALn9rR+qrq7Qib2AqSLFNDV/P4dBC+w+5yBFYpnp7BRO7RAY0ZIL eHUwpXZzq9q3vbfnhPahYiJ+6jhKicPGy80CAwEAAQJAfmntQZjBIhCbjjHkw71F vxa+FzAe6nPWpBiE7BgSXboeqfKJHB2zJ0ODi/+a8jMU1O8ICsI22GJ4xkdBTThI AQIhAOBa9nlPT6KkYiVYGxFPUVE/Vis/tuVA19nhSpC5yk8XAiEA1Dly+ItWmRjz xYvv64uv8k9ZpMjhSH+rAt1AqjVs6rsCIFFljyCp/qlyXE1SLtfT4BvLD9c3EYMR SH669xOU5GpXAiBjCqCOP7DdaBiz87e3LIyjP8btMVZ52CL+BjWceaxn6wIhAJxo FQUwOEMwHg0oe/eXykakCKS/lPjtyhf6NaFn82kI -----END RSA PRIVATE KEY-----. 5. 개인키 파일을 패스프레이즈로 암호화하기 openssl rsa -des -in key1.pem -out key2.pem OR (만약 triple-DES를 사용하여 암호화한다면…) openssl rsa -des3 -in key1.pem -out key2.pem openssl rsa -idea -in delthis2.key -out delthis3.key. 6. (7) read RSA private key writing RSA private key Enter PEM pass phrase:11111111 Verifying password - Enter PEM pass phrase:11111111 -----BEGIN RSA PRIVATE KEY----Proc-Type: 4,ENCRYPTED DEK-Info: IDEA-CBC,9565D60C29080DB2. Uu8YpSMdmGVJWQsSSke0174Nv5nFw+ESvQfiom8vF9MSW+vFg8BUs0AmEjzlmWkZ uDpJGgIKa3LBspvqG718HuoeTp3/HRgWYECHTjf/RV3sSK1Ka3eGKwslFTMPNkFK 7ITFBa22QgVBOvdIKsbQgWZgE3gtah2aDhUATd6kpoQtmlcK17+BLAUki1/JuKuj NrjP6tOTtNrGunA6gwPj8xiCwLWq3N3we/6Yk+HGlIy5GgMlWAk1Y/NJs56EoxsV t28J+nDMic/oucRwlNOesEh62Uo8qu6cklFbQfJion9v1gkQMHl4Z/So4rIDyJM1 Em89gg2QtAw6PAAFxfWuD8Q35bgRYuaOfLPFCwV1XLPVXOWpuDBmjDnQ47eXlWel 4RbKajq1TDckle4j85jsRMDTBs1bwGO4WkRtuOixkeY= -----END RSA PRIVATE KEY-----. 6. 인증서 신청서의 생성 (CSR) CSR은 CA에 전송되는 인증서 신청자에 대한 정보를 포함하는 구조체로 다양한 형태의 CSR이 있을 수 있으나 현재 PKCS#10 형식의 CSR이 가장 널리 사용되고 있다. CSR에는 당근 private key가 빠져있다. 경우에 따라서 개인키를 CA에서 생성하는 경우도 있으나 아주 극단적인 예이다. CSR에 CA가 자신의 인증서를 사용하여 서명하면 인증서가 생성된다. (그래서 인증서 생성 요청을 signing을 요청한다고 말한다) OpenSSL의 경우 다음과 같은 명령을 사용하여 CSR을 생성한다. openssl req -new -key key.pem -out csr.pem key.pem은 위의 경우와 같이 키를 미리 생성한 경우이고 개인키 까지 한꺼먼에 생성하여면 openssl req -new -key key.pem -out csr.pem –keyout key.pem 과 같이 두드리면 된다. 생성된 CSR.PEM 파일은 -----BEGIN CERTIFICATE REQUEST----MIIBETCBvAIBADBXMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEh MB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYJKoZIhvcNAQkB FgFgMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL6nPTy3avNgbubx+ESmD4LV1LQG fcSh8nehEOIxGwmCPlrhTP87PaA0XvGpvRQUjCGStrlQsd8lcYVVkOaytNUCAwEA AaAAMA0GCSqGSIb3DQEBBAUAA0EAXcMsa8eXgbG2ZhVyFkRVrI4vT8haN39/QJc9. 7. (8) BrRh2nOTKgfMcT9h+1Xx0wNRQ9/SIGV1y3+3abNiJmJBWnJ8Bg== -----END CERTIFICATE REQUEST-----. 7. 자가 서명된(self-signed) 인증서 생성 CA 인증서는, 특히 root CA 인증서는 인증 구조의 최 상위에 있기 때문에 rootCA를 인증할 수 있는 개체는 rootCA 뿐이다. 스스로가 스스로의 CSR에 서명한 형태의 인증서를 selfsigned 인증서라 한다. openssl req -new -x509 -key key.pem -out dummy.pem 또는 CSR을 미리 생성한 경우 openssl ca –in req.pem –signkey key.pem –out cacert.pem 과 같이 생성한다. 이렇게 생성된 인증서의 내용을 text로 보기 위해서는 openssl x509 -text -in cacert.crt Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=KR, CN=rootCA Validity Not Before: Feb 28 07:57:44 2000 GMT Not After : Feb 27 07:57:44 2001 GMT Subject: C=KR, ST=SEOUL, L=SEOUL, O=PKI, OU=PKI, CN=my_name/Email=bugbug [email protected] Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:c4:5d:2a:56:eb:fa:25:b9:ad:cc:e0:69:7b:7f: 8b:72:08:40:43:f8:61:37:3f:89:a1:6f:56:8a:49: 7a:e1:9b:8b:a2:14:e9:76:fd:e8:f9:d3:e5:6e:dc: 70:a0:69:17:f8:76:8f:2e:c2:96:5c:cd:95:4c:c3: 5f:cd:a1:f7:20:0a:28:41:f5:a2:a1:73:ee:35:5a: 79:67:c8:17:89:23:17:83:96:b6:6a:73:8b:47:a7: e2:89:97:5a:b8:8b:4e:5a:d9:49:b3:0c:84:ec:60: c6:42:0a:2b:7b:ec:67:3e:28:d0:74:d6:3a:5b:d2:. 8. (9) ca:8f:16:0f:e6:ee:0e:db:33 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Alternative Name: email:[email protected] X509v3 Basic Constraints: CA:FALSE, pathlen:0 Netscape Comment: CertMgr :. .. Netscape Cert Type: SSL Client Signature Algorithm: md5WithRSAEncryption 08:70:52:cc:9f:37:7f:23:50:76:a6:8c:c6:cb:2b:74:19:f2: de:2b:cc:3f:d1:f6:ab:a7:ab:66:18:ac:c4:40:be:5e:e5:ef: 67:ce:8f:01:94:4c:10:bd:0f:87:f0:8f:6f:e8:55:4b:bf:60: 41:93:f8:26:07:e5:40:1c:ee:09:5d:1e:64:c5:32:cb:1c:20: 7e:87:98:05:0d:91:57:9d:08:71:41:fb:ef:a6:1e:60:c8:06: 90:c1:62:10:5e:d0:8c:cd:65:6a:fe:52:3b:da:a1:7e:4d:52: 49:a7:48:e5:87:a5:28:60:28:e0:47:36:7b:15:93:b1:74:71: f2:75 -----BEGIN CERTIFICATE----MIICkTCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQQFADAeMQswCQYDVQQGEwJLUjEP MA0GA1UEAxMGcm9vdENBMB4XDTAwMDIyODA3NTc0NFoXDTAxMDIyNzA3NTc0NFow fzELMAkGA1UEBhMCS1IxDjAMBgNVBAgTBVNFT1VMMQ4wDAYDVQQHEwVTRU9VTDEM MAoGA1UEChMDUEtJMQwwCgYDVQQLEwNQS0kxEDAOBgNVBAMUB215X25hbWUxIjAg BgkqhkiG9w0BCQEWE2J1Z2J1ZzcxQG5ldHNnby5jb20wgZ8wDQYJKoZIhvcNAQEB BQADgY0AMIGJAoGBAMRdKlbr+iW5rczgaXt/i3IIQEP4YTc/iaFvVopJeuGbi6IU 6Xb96PnT5W7ccKBpF/h2jy7CllzNlUzDX82h9yAKKEH1oqFz7jVaeWfIF4kjF4OW tmpzi0en4omXWriLTlrZSbMMhOxgxkIKK3vsZz4o0HTWOlvSyo8WD+buDtszAgMB AAGjfjB8MB4GA1UdEQQXMBWBE2J1Z2J1ZzcxQG5ldHNnby5jb20wDAYDVR0TBAUw AwIBADA5BglghkgBhvhCAQ0ELBYqQ2VydE1nciA6IMWstvPAzL7wxq4gwM7B9byt uKYgu/28usfVtM+02S4gMBEGCWCGSAGG+EIBAQQEAwIHgDANBgkqhkiG9w0BAQQF AAOBgQAIcFLMnzd/I1B2pozGyyt0GfLeK8w/0farp6tmGKzEQL5e5e9nzo8BlEwQ vQ+H8I9v6FVLv2BBk/gmB+VAHO4JXR5kxTLLHCB+h5gFDZFXnQhxQfvvph5gyAaQ wWIQXtCMzWVq/lI72qF+TVJJp0jlh6UoYCjgRzZ7FZOxdHHydQ== -----END CERTIFICATE-----. 9. (10) openssl x509 -text -in cacert.crt –noout 인 경우 -----BEGIN CERTIFICATE-----에서 -----END CERTIFICATE----- 부분이 출력되지 않는 다.. 10. (11) openssl ca 인증서의 생성과 관련한 기능을 수행한다. 인증서의 생성 입력으로는 CSR 파일(PKCS#10으 로 encoding된 파일)과 SPKAC 파일이 될 수 있다. ca 옵션 -verbose. 메시지를 마미마니 출력한다.. (-batch 메시지를 출력하지 않는다. CGI에서 사용할 때 유. 용) -config filename. default config 파일(/usr/local/ssl/openssl.cnf)과 다른 config 파일을 사용한다.. -days arg. 인증서의 유효기간을 설정한다.. -gencrl days. CRL의 유효기간. -md arg. 메시지 다이제스트 함수를 지정할 수 있다. md2, md5, sha, sha1 중의 하나를 선택할 수. –days 365 à 유효기간 1년의 인증서. 있다. -policy arg. CA의 policy 중 하나를 지정할 수 있다. (후술). -keyfile arg. 서명에 이용될 CA의 개인키 파일 (암호화되어 있음). -key arg. 개인키 파일의 암호화에 이용된 passphrase. -cert. CA의 인증서 파일. -in file. PEM 타입으로 encode된 CSR. -out file. 출력될 인증서 파일 명 (인증서 파일명을 정해준다). -outdir dir. 인증서가 출력될 directory (인증서 파일 명 à serial.pem). -infiles file. CSR의 리스트를 포함하는 파일. SPKAC 파일 (Netscape only). Netscape의 <KEYGEN> tag에 의해 생성되는 SPKAC 값을 포함하는 파일. Email = [email protected] C = KR CN = [email protected] O = SecureSoft OU = pki L = seoul SPKAC = MIIBOjCBpDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC dOXM4vzcTdcDC1G711EZwyiRpZtQYmhqOXQCvhBIAdxNiQNUER1 6U2VmoDyEcuuW32NG5WIS4iaQ5Nr8KmGt/dH6OxXqnmAWqDMOtl b6bYsthGBS5bFG0n5NG08LQSdySafhjahu0B0YeKuISR962NloZ7OtT /CchjX/DgwsCAwEAARYAMA0GCSqGSIb3DQEBBAUAA4GBAINOuS Hl2/mvyYKDk1jspi9lx1UvLfp+y9MXi4VS3Kt2pxk8u91Y39M1jOErqr Tce8MWWIGrjqbmWHTcng1OP5HyuOOx8o16MeM1DTUQc+kegYv6. 11. (12) QgjVvamh1WlB75WPP0xpozKFdU2pYl4LHNKCf9WndT5xYFG4Ndrm 6rmK6t5v. 12. (13) OpenSSL Config File. [표 1] config file format [ ca ] default_ca = CA_default. # The default ca section. [ CA_default ] dir. = /TEMP-FOLDER/openssl-0.9.3a/apps/secureCA. certs. = $dir/certs. crl_dir. = $dir/crl. database. = $dir/index.txt. new_certs_dir. = $dir/newcerts. certificate. = $dir/cacert.pem. serial. = $dir/serial. crl. = $dir/crl.pem. private_key. = $dir/private/cakey.txt. RANDFILE. = $dir/private/.rand. x509_extensions. = usr_cert. crl_extensions. = crl_ext. default_days. = 365. default_crl_days. = 30. default_md. = md5. preserve. = no. policy. = policy_match. # database index file.. [ policy_match ] countryName. = match. stateOrProvinceName. = match. organizationName. = match. organizationalUnitName. = optional. commonName. = supplied. emailAddress. = optional. [ policy_anything ] countryName. = optional. 13. (14) stateOrProvinceName. = optional. localityName. = optional. organizationName. = optional. organizationalUnitName. = optional. commonName. = supplied. emailAddress. = optional. [ req ] default_bits. = 1024. default_keyfile. = privkey.pem. distinguished_name. = req_distinguished_name. attributes. = req_attributes. x509_extensions. = v3_ca. # The extentions to add to the self signed cert. [ req_distinguished_name ] countryName. = Country Name (2 letter code). countryName_default. = KR. countryName_min. =2. countryName_max. =2. stateOrProvinceName. = State or Province Name (full name). stateOrProvinceName_default. = Some-State. localityName. = Locality Name (eg, city). organizationalUnitName. = Organizational Unit Name (eg, section). commonName. = Common Name (eg, YOUR name). commonName_max. = 64. emailAddress. = Email Address. emailAddress_max. = 40. [ req_attributes ] challengePassword. = A challenge password. challengePassword_min. =4. challengePassword_max. = 20. unstructuredName. = An optional company name. [ usr_cert ] basicConstraints =CA:FALSE. 14. (15) nsCertType. = client, email, objsign. keyUsage. = nonRepudiation, digitalSignature, keyEncipherment. nsComment. = "Personal Certificate generated by SecureSoft CA". subjectKeyIdentifier. =hash. authorityKeyIdentifier =keyid,issuer:always subjectAltName. =email:copy. issuerAltName. =issuer:copy. #nsCaRevocationUrl. = http://www.domain.dom/ca-crl.pem. #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName. [ v3_ca ] subjectKeyIdentifier. =hash. authorityKeyIdentifier =keyid:always,issuer:always #basicConstraints. = critical,CA:true. basicConstraints. = CA:true. keyUsage. = cRLSign, keyCertSign. nsCertType. = sslCA, emailCA. subjectAltName. =email:copy. issuerAltName. =issuer:copy. basicConstraints. = critical, RAW:30:03:01:01:FF. [ crl_ext ] issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always,issuer:always. CA 환경 설정 OpenSSL에서 필요한 대부분의 설정 값들은 openssl.cnf. 파일에 저장되어 있다. CA로서의. 역할을 수행하기 위한 값들은 CA_default section에 정의된다. 이름. 설명. dir. CA에 관련된 모든 파일의 기본 directory. 15. (16) newcerts. 새롭게 발행된 인증서들이 저장되는 위치. database file. 간단한 text 파일로 발행된 인증서들에 대한 정보를 포함하는 일종의 DB 역할을 한다.. policy. 기본(default) policy 명. Policy section은 DN 객체들이 인증서에 나타나는 조건을 명시한다. 1.. match – CA 인증서에 있는 값과 사용자가 신청한 값이 반드시 일치해야 함. 2.. optional – 없어도 되는 값. 3.. supplied – 인증서 신청 시 반드시 포함되야 한다.. policy_match 가 다음과 같다고 가정하면. countryName. = match. stateOrProvinceName. = match. organizationName. = match. organizationalUnitName. = optional. commonName. = supplied. emailAddress. = optional. 사용자가 입력한 신청 DN 중 countryName, stateOrProvinceName, organizationName은 인증 서를 발급하는 CA의 인증서에 있는 값과 반드시 일치해야 한다. organizationalUnitName, emailAddress은 없어도 되지만, commonName은 반드시 입력되어야 한다.. 16. (17) CA index 파일 OpenSSL 은 발급된 인증서들에 관한 정보를 text 형식의 DB 에 저장한다. 형식은 다음과 같다 status. Expired Date. V. 021031064407Z. R. 021031063252Z. Revoked Date. 000130122731Z. Serial. certificate. CN. 01. unknown. /C=KR/ CN=rootCA. 02. unknown. /C=KR/O=SecureSoft/CN=jkkim/Email=1234 @.1.1.1. V. 021031065515Z. 03. unknown. /C=KR/ST=3333/L=3333/O=3333/OU=3/CN= 333/Email=3333. R. 010128030114Z. 000130122731Z. 04. unknown. /C=KR/ /CN=anber/[email protected]. V. 021031071531Z. 05. unknown. /C=45/ST=234523io45/L=2345234/O=Interne t Widgits Pty Ltd. l. 현재 version 에서는 “certificate” 항목이 제대로 갱신되지 않는다.. l. Serial Number 를 결정하기 위해 serial 파일을 이용한다.. l. CRL 을 발행하는데 참조 파일로 이용된다.. 17. (18) 인증서의 내용 사용자에 관한 정보를 식별하는데 DN(Distinguished Name)을 사용한다. DN은 X.509 표준에서 정의되었으며 필드명과 필드명에 대한 약어를 정의한다. 표 2 : Distinguished Name Information 필드. 약어. 설명. 예. Common Name. CN. 피 인증자 명. CN=Frederick Hirsch. O. 피 인증자가 소속된 기관, 단체, 회사…. O=Securesoft, Inc. Organizational Unit. OU. 소속 기관의 부서. OU=PKU team. City/Locality. L. 도시명. L=seoul. State/Province. SP. 도/주. SP=Massachussetts. Country. C. 국가명 (ISO code). C=US, C=KR. Organization or. Company. 인증서의 Encoding 인증서의 바이너리 form은 ASN.1을 이용하여 정의된다.. ASN.1 표기법은 인증서의 내용을. binary form으로 변환하는 방법을 기술한다. 인증서의 binary encoding은 DER(Distinguished Encoding Rules)에 의해 정의되며 DER은 좀더 일반적인 encoding rule인 Basic Encoding Rules (BER)에 기반한다. 조작을 용이하게 하기 위해 ASCII 형태로 변환하데 Base64를 이용한다. Base64를 이용하는 Encoding을 PEM. Encoding이라 한다.. -----BEGIN CERTIFICATE----base64-encoded content… -----END CERTIFICATE----Base64 Encoding 은 RFC1421-1424 PEM(Privacy Enhanced Mail) 표준에서 처음으로 정의되었다.. OpenSSL CA Creation. [STEP 1] CA 인증서(self-signed)의 생성. CA를 생성하기 위한 첫 번째 과정은 당근 CA의 인증서를 생성하는 것이다. CA 인증서도 인증서의 일종이므로 개인키에 의해 서명되어야 하는데 주로 VeriSign 과 같은 지명도 있는 인증 기관의 인증서를 이용하여 서명하는 것이 좋다. 그러나 “돈”이 들기 때문에 비 상용이나 test 용 CA의 경우는 Self-sign한 인증서를 CA 인증서로 사용한다. (VeriSign CA 인증서도 self-signed되어 있다) CA의 인증서를 ca.crt, 개인키를 ca.key로 생성한다. 인증서나 개인키 CSR의 이름은 다음과 같이 하는 것이 편리하다.. 18. (19) 인증서. entity.crt. 개인키. entity.key. 인증서 신청서. entity.csr. openssl req –new –out ca.csr –keyout ca.key … CA 관련 정보를 입력한다…. openssl ca –in ca.csr –signkey ca.key –out ca.crt –config config_file_name –name casection_name 또는 openssl req -new -x509 -key key.pem -out dummy.pem … CA인증서가 생성된다… CA가 제 역할을 수행하기 위해서는 CA 인증서가 Browser(또는 PKI client)에 설치되어 있어야 한다. Browser에 인증서를 설치하기 위한 MIME type은 application/x-x509-ca-cert이다.. [표 3] CA 인증서 다운로드 page - HTML <HTML><HEAD><TITLE>Load CA Certificate</TITLE></HEAD><BODY> <H1>Load Certificate Authority Certificate</H1> <FORM ACTION="http://example.osf.org/cgi-bin/loadCAcert.pl" METHOD=post> <TABLE><TR> <TD>Netscape Browser (PEM Format):</TD> <TD><INPUT TYPE="RADIO" NAME="FORMAT" VALUE="PEM" CHECKED></TD></TR> <TR><TD>Microsoft Browser (DER Format):</TD> <TD><INPUT TYPE="RADIO" NAME="FORMAT" VALUE="DER"></TD></TR> </TABLE> <INPUT TYPE="SUBMIT" VALUE="Load Certificate"> </FORM> </BODY></HTML>. 19. (20) [표 4] CA 인증서를 Browser에 설치하는 Perl 스크립트. #!/usr/local/bin/perl -T require 5.003; use strict; use CGI; my $cert_dir = "/opt/www/lib/certs"; my $cert_file = "CAcert.pem"; my $query = new CGI; my $kind = $query->param('FORMAT'); if($kind eq 'DER') { $cert_file = "CAcert.der"; } my $cert_path = "$cert_dir/$cert_file"; open(CERT, "<$cert_path"); my $data = join '',; close(CERT); print "Content-Type: application/x-x509-ca-cert\n"; print "Content-Length: ", length($data), "\n\n$data"; 1;. [STEP 2] 서버 인증서의 생성. 서버 인증서는 SSL 서버가 클라이언트를 인증하는 과정에서 사용된다 먼저 CSR을 생성해야 한다. (CSR은 위에서 생성한 self-signed CA 인증서에 의해 서명된다) (1) openssl req –new –out server.csr –keyout server.key (2) openssl ca –in server.csr –out server.crt (3) 이 인증서와 키를 (apache web server의 경우), /conf/ssl.crt, /conf/ssl.key 밑에 각각 복사하면 된다.. ./openssl req -new -keyout newkey.pem -out newreq.pem -days 360 -config ssleay.cnf Using configuration from /opt/www/lib/ssleay.cnf Generating a 512 bit private key writing new private key to 'newkey.pem' Enter PEM pass phrase:11111111 Verifying password - Enter PEM pass phrase:11111111 -----. 20. (21) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [US]:KR State or Province Name (full name) [MA]:SEOUL Locality Name (eg, city) [Cambridge]:SEOUL Organization Name (eg, company) [The Open Group]:SecureSoft Organizational Unit Name (eg, section) [Research Institute]:PKI TEAM Common Name (eg, YOUR name) [example.osf.org]:nrg.securesoft.co.kr Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:11111111 An optional company name []:Hacker Company. 생성된 CSR 즉 server.csr은 다음과 같다. -----BEGIN CERTIFICATE REQUEST----MIIBXTCCAQcCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJNQTESMBAGA1UE ... Aty7AlcmN9XNwxUk1w0H3hk= -----END CERTIFICATE REQUEST-----. 서버의 개인키는 다음과 같다. -----BEGIN RSA PRIVATE KEY----Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,21F13B37A796482C XIY0c7gnv0BpVKkOqXIiqpyONx8xqW67wghzDlKyoOZt9NDcl9wF9jnddODwv9ZU ... QxS2zwfKG1u+YqS1c2v5ecBgqW78DQLvxMkpYU8+xge7vDeoYKE14w== -----END RSA PRIVATE KEY-----. 21. (22) [STEP 3] client 인증서의 생성. client 인증서를 생성하는 과정은 보통 다음과 같다. (1) 사용자: 인증서 신청 HTML page에 접속한다.. (2) 사용자 : 자신의 개인정보를 입력한다. (3) Submit 버튼이 눌리면 다음 과정을 수행한다. i.. Browser는 키 쌍을 생성한다. (public/private key).. ii.. Private key는 browser에 저장된다.. iii.. Public key와 개인정보는 서버로 전송된다.. iv.. Server는 CGI script를 이용 인증서를 생성하고 사용자가 이를 load 할 수 있도록 한다.. l. 키 길이(512bits) à <KEYGEN> 태그에 의해 생성. l. 인증서 신청 à 개인정보와 공개키가 서버로 전송된다.. l. 공개키 à SPKAC 형태로 생성된다. (Signed Public Key And Challenge) n. SPKAC = MIIBOj……. 22. (23) Email = [email protected] C = KR CN = [email protected] O = SecureSoft SPKAC = MIIBOjCBpDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCdOXM4vzcTdcDC1G711EZwyiRpZtQYmhqOXQ CvhBIAdxNiQNUER16U2VmoDyEcuuW32NG5WIS4iaQ5Nr8KmGt/dH6OxXqnmAWqDMOtlb6bYsthGBS5bFG0n5NG0 8LQSdySafhjahu0B0YeKuISR962NloZ7OtT/CchjX/DgwsCAwEAARYAMA0GCSqGSIb3DQEBBAUAA4GBAINOuS Hl2/mvyYKDk1jspi9lx1UvLfp+y9MXi4VS3Kt2pxk8u91Y39M1jOErqrTce8MWWIGrjqbmWHTcng1OP5HyuOOx8o16Me M1DTUQc+kegYv6QgjVvamh1WlB75WPP0xpozKFdU2pYl4LHNKCf9WndT5xYFG4Ndrm6rmK6t5v. l. CA 서버 : l. 개인정보와 SPKAC를 파일 형태로 만든다. à 0001.csr. l. openssl ca –spkac 0001.csr –out 0001.crt. 23. (24) Explorer 의 경우. IE 는 인증서를 생성하는 내장된 tag는 존재하지 않는다.. 따라서 java Script 또는 VB. script를 이용하여 certenroll.dll (IE 3.x) 또는 xenroll.dll(IE 4.x)의 내장 함수들을 호출한다.. openssl ca -policy policy_anything -out newcert.pem -config ssleay.cnf -infiles new.pem Using configuration from /opt/www/lib/ssleay.cnf Enter PEM pass phrase:11111111 Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :PRINTABLE:'MA' localityName :PRINTABLE:'Cambridge' organizationName :PRINTABLE:'The Open Group' organizationalUnitName:PRINTABLE:'Research Institute' commonName :PRINTABLE:'example.osf.org' emailAddress :IA5STRING:'[email protected]' Certificate is to be certified until May 12 15:39:33 1998 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated. 24. (25) Netscape의 인증서 신청 form <HTML><HEAD><TITLE>클라이언트 인증서 생성</TITLE></HEAD><BODY> <CENTER><H1> 클라이언트 인증서 생성 </H1></CENTER> <FORM NAME="GenerateForm" ACTION="http://example.osf.org/cgi-bin/ns_key.pl"> <TABLE> <TR><TD>이름:</TD><TD> <INPUT TYPE="TEXT" NAME="commonName" VALUE="" SIZE=64> </TD></TR> <TR><TD>email:</TD><TD> <INPUT TYPE="TEXT" NAME="emailAddress" VALUE="" SIZE=40> </TD></TR> <TR><TD>조직:</TD><TD> <INPUT TYPE="TEXT" NAME="organizationName" VALUE=""> </TD></TR> <TR><TD>부서:</TD><TD> <INPUT TYPE="TEXT" NAME="organizationalUnitName" VALUE=""> </TD></TR> <TR><TD>지역(도시):</TD><TD> <INPUT TYPE="TEXT" NAME="localityName" VALUE=""> </TD></TR> <TR><TD>주(state) 명:</TD><TD> <INPUT TYPE="TEXT" NAME="stateOrProvinceName" VALUE=""> </TD></TR> <TR><TD>국가명:</TD><TD> <INPUT TYPE="TEXT" NAME="countryName" VALUE="KR" SIZE="2"> </TD></TR> </TABLE> <!--. keygen 은 Netscape에서만 인식된다. IE는 이 TAG를 무시한다. -->. <KEYGEN NAME="SPKAC" CHALLENGE="challengePassword"> <INPUT TYPE="SUBMIT" NAME="SUBMIT"> </FORM> <P><HR></BODY></HTML>. 25. (26) [표 5] 인증서 생성 Perl 스크립트. #!/usr/local/bin/perl require 5.003; use strict; use CGI; use File::CounterFile; # module to maintain certificate request counter my $doc_dir = $ENV{'DOCUMENT_ROOT'}; # apache specific location for storage unless($doc_dir) { print "<HTML><HEAD><TITLE>Failure</TITLE></HEAD>"; print "<BODY>DOCUMENT_ROOT not defined</BODY></HTML>"; exit(0); } my $base_dir = $doc_dir; $base_dir =~ s/\/htdocs//; my $SSLDIR = '/opt/dev/ssl'; # define where SSLeay files are located my $CA = "$SSLDIR/bin/ca"; my $CONFIG = "/opt/www/lib/ssleay.cnf"; my $CAPASS = "caKEY"; my $query = new CGI; # get a handle on the form data my $key = $query->param('SPKAC'); # this will fail if not Netscape browser. 26. (27) unless($key) { fail("No Key provided $key. Netscape required"); } my $counter = new File::CounterFile("$base_dir/.counter", 1); unless($counter) { fail("Could not create counter: $!"); } my $count = $counter->inc(); my $certs_dir = "$base_dir/certs"; my $req_file = "$certs_dir/cert$count.req";. # 인증서 신청서 파일 명. my $result_file = "$certs_dir/cert$count.result";. # 인증서 파일 명. # Explicitly list form fields we must have for certificate creation to work. my @req_names = ('commonName', 'emailAddress', 'organizationName', 'organizationalUnitName', 'localityName', 'stateOrProvinceName', 'countryName', 'SPKAC'); # build the request file open(REQ, ">$req_file") or fail("Could not create request $req_file: $!"); my $name; foreach $name (@req_names) { my $value = $query->param("$name"); $value =~ tr/\n//d; print REQ "$name = $value\n"; } close(REQ); # make sure we actually created a request file unless(-f $req_file) { fail("request missing: $req_file"); } unless(-e $CA) { fail("command missing"); }. # ensure that ca command will run. # command for processing certificate request, without password my $cmd = "$CA -config $CONFIG -spkac $req_file -out $result_file -days 360"; my $rc = system("$cmd -key $CAPASS 2>errs"); if($rc != 0) { fail("$cmd<P>rc = $rc", "errs"); } open(CERT, "<$result_file") or fail("Could not open $result_file<P>$!");. # browser에 인증서를 설치한다. /x-x509-user-cert는 Netscape-only IE는 이를 무시한다. print "Content-Type: application/x-x509-user-cert\n"; my $result = join '', <CERT>; close CERT; my $len = length($result); print "Content-Length: $len\n\n"; print $result; exit(0);. 27. (28) sub fail { my($msg, $errs) = @_; print $query->header; print $query->start_html(-title => "Certificate Request Failure"); print "<H2>Certificate request failed</H2>$msg<P>"; if($errs) { if(open(ERR, "<errs")) { while(<ERR>) { print "$_<BR>"; } close ERR; } } print $query->dump(); print $query->end_html(); exit(0); } 1;. 28. (29) [표 6] IE 인증서 발급. #!/usr/local/bin/perl require 5.003; use strict; use CGI;. use File::CounterFile; # module to maintain certificate request counter. my $SSLDIR = '/opt/dev/ssl'; my $CA = "$SSLDIR/bin/ca"; my $CRL2PKCS7 = "$SSLDIR/bin/crl2pkcs7"; my $CONFIG = "/opt/www/lib/ssleay.cnf"; my $CRL = "$SSLDIR/crl/crl.pem"; my $CAPASS = "caKEY"; my $doc_dir = $ENV{'DOCUMENT_ROOT'}; # apache specific location for storage unless($doc_dir) { print "<HTML><HEAD><TITLE>Failure</TITLE></HEAD><BODY>DOCUMENT_ROOT not defined</BODY></HTML>"; exit(0); my $base_dir = $doc_dir; $base_dir =~ s/\/htdocs//;. my $query = new CGI; my $req = $query->param('reqEntry');. unless($req) { fail("No Certificate Request Provided"); }. my $counter = new File::CounterFile("$base_dir/.counter", 1); unless($counter) { fail("Count not create counter: $!"); }. 29. (30) my $count = $counter->inc();. my $certs_dir = "$base_dir/certs"; my $req_file = "$certs_dir/cert$count.req"; my $result_file = "$certs_dir/cert$count.result"; my $key_file = "$certs_dir/$count.key"; my $debug_file = "$certs_dir/$count.debug"; my $pkcs7_file = "$certs_dir/cert$count.pkcs";. #process request $req =~ tr/\r//d; $req =~ tr/\n//d;. # save the certificate request to a file, as received open(REQ, ">$req_file") or fail("Could no save certificate request to file"); print REQ "-----BEGIN CERTIFICATE REQUEST-----\n"; my $result = 1; while($result) { $result = substr($req, 0, 72); if($result) { print REQ "$result\n"; $req = substr($req, 72); } } print REQ "-----END CERTIFICATE REQUEST-----\n"; close(REQ); unless(-e $CA) { fail("$CA command missing"); } my $cmd = "$CA -config $CONFIG -in $req_file -out $result_file -days 360 -policy policy_match"; my $rc = system("$cmd -key $CAPASS 2>errs <<END\ny\ny\nEND"); my $session = $query->param('sessionId'); my $cn = $query->param('commonName'); if($rc != 0) { fail("Certification Request Failed</h2>$cmd<P>rc = $rc<P>\ sessionID = $session<BR>req = $req<BR>", "errs"); } my $cmd = "$CRL2PKCS7 -certfile $result_file -in $CRL -out $pkcs7_file"; my $rc = system("$cmd 2>errs"); open(CERT, "<$pkcs7_file") or fail("Could not open $pkcs7_file<P>$!");. 30. (31) my $certificate = ""; my $started = 0; while(<CERT>) { if(/BEGIN PKCS7/) { $started = 1; next; } if(/END PKCS7/) { last; } if($started) { chomp; $certificate .= "$_"; } } close(CERT);. open(MSG, ">msg") or fail("Could not generate message");. print MSG <<_END_TEXT_; <HTML><HEAD><TITLE>Finish Client Certificate Installation</TITLE>. <!-- Use the Microsoft ActiveX control to install the certificate --> <OBJECT CLASSID="clsid:33BEC9E0-F78F-11cf-B782-00C04FD7BF43" CODE=certenr3.dll. ID=certHelper>. </OBJECT> <SCRIPT LANGUAGE="JavaScript"> <!-function InstallCert (subject, sessionId, cert) { if( sessionId == "") { alert("No Session id"); return; }if(cert == "") { alert("No Certificate"); return; }. 31. (32) var doAcceptanceUILater = 0; result = certHelper.AcceptCredentials(sessionId, cert, 0, doAcceptanceUILater); if(result == "") { var msg = "Attempt to install " + subject + " client certificate failed"; alert(msg); return false; } else { var msg = subject + " client certificate installed"; alert(msg); } } --> </SCRIPT> </HEAD> <BODY onLoad="InstallCert('$cn', '$session', '$certificate');"> Installing client certificate for $cn<BR> session: $session<BR> </BODY> </HTML> _END_TEXT_ close(MSG); open(RD, "<msg") or fail("Could not open msg file"); my $msg = join '', <RD>; close(RD); my $len = length($msg); print "Content-Type: text/html\n"; print "Content-Length: $len\n\n"; print $msg;. exit(0);. sub fail { my($msg, $errs) = @_; print $query->header; print $query->start_html(-title => "Certificate Request Failure");. 32. (33) print "<H2>Certificate request failed</H2>$msg<P>"; if($errs) { if(open(ERR, "<errs")) { while(<ERR>) { print "$_<BR>"; } close ERR; } } print $query->dump(); print $query->end_html(); exit(0); }1;. 33. (34) [표 7]. IE 의 인증서 신청 form. <HTML><HEAD><TITLE>클라이언트 인증서 신청</TITLE></HEAD><BODY> <!-- Use the Microsoft ActiveX control to generate the certificate --> <OBJECT CLASSID="clsid:33BEC9E0-F78F-11cf-B782-00C04FD7BF43" CODEBASE=certenr3.dll ID=certHelper> </OBJECT> <!-- JavaScript or Visual Basic will work. --> <SCRIPT LANGUAGE="JavaScript"> <!--// this is from JavaScript: The Definitive Guide, since Microsoft implementation of Math.random() is broken // function random() { random.seed = (random.seed*random.a + random.c) % random.m; return random.seed/random.m; } random.m = 714025; random.a = 4096; random.c = 150889; random.seed = (new Date()).getTime()%random.m; function GenReq () { var sessionId = "a_unique_session_id"; var reqHardware = 0; var szName = ""; var szPurpose = "ClientAuth"; var doAcceptanceUINow = 0; var doAcceptanceUILater = 0; var doOnline = 1; var keySpec = 1; szName = ""; if (document.GenReqForm.commonName.value == "") { alert("No Common Name"); return false; } else szName = "CN=" + document.GenReqForm.commonName.value; if (document.GenReqForm.countryName.value == "") {. 34. (35) alert("No Country"); return false; }else szName = szName + "; C=" + document.GenReqForm.countryName.value; if (document.GenReqForm.stateOrProvinceName.value == "") { alert("No State or Province"); return false; }else szName = szName + "; S=" + document.GenReqForm.stateOrProvinceName.value; if (document.GenReqForm.localityName.value == "") { alert("No City"); return false;}else szName = szName + "; L=" + document.GenReqForm.localityName.value; if (document.GenReqForm.organizationName.value == "") { alert("No Organization"); return false; }else szName = szName + "; O=" + document.GenReqForm.organizationName.value; if (document.GenReqForm.organizationalUnitName.value == "") { alert("No Organizational Unit"); return false; }else szName = szName + "; OU=" + document.GenReqForm.organizationalUnitName.value; /* make session id unique */ sessionId = "xx" + Math.round(random() * 1000); sz10 = certHelper.GenerateKeyPair(sessionId, reqHardware, szName, 0, szPurpose, doAcceptanceUINow, doOnline, keySpec, "", "", 1); /* * The condition sz10 being empty occurs on any condition in which the credential was not successfully generated. In particular, it occurs when the operation was cancelled by the user, as well as additional errors. A cancel is distinguished from other unsuccessful generations by an empty sz10 and an error value of zero.. 35. (36) */ if (sz10 != "") { document.GenReqForm.reqEntry.value = sz10; document.GenReqForm.sessionId.value = sessionId; } else { alert("Key Pair Generation failed"); return false; } } //---> </SCRIPT> <CENTER><H3>Generate key pair and client certificate request</H3></CENTER> <FORM METHOD=POST ACTION=http://example.osf.org/cgi-bin/ms_key.pl. NAME="GenReqForm". onSubmit="GenReq()"> <TABLE> <TR><TD>이름:</TD><TD><INPUT TYPE=TEXT NAME="commonName" VALUE="" SIZE=64> </TD></TR><TR><TD>국가명:</TD><TD><INPUT TYPE=TEXT NAME="countryName" VALUE="" SIZE=2> </TD></TR><TR><TD>주/도명:</TD><TD><INPUT TYPE=TEXT NAME="stateOrProvinceName" VALUE=""> </TD></TR><TR><TD>도시명:</TD><TD><INPUT TYPE=TEXT NAME="localityName" VALUE=""> </TD></TR><TR><TD>조직:</TD><TD><INPUT TYPE=TEXT NAME="organizationName" VALUE=""> </TD></TR><TR><TD>부서:</TD><TD><INPUT TYPE=TEXT NAME="organizationalUnitName" VALUE=""> </TD></TR></TABLE> <INPUT TYPE=HIDDEN NAME="sessionId"> <INPUT TYPE=HIDDEN NAME="reqEntry"> <INPUT TYPE="SUBMIT" name="SUBMIT"> </FORM> </BODY></HTML>. 36. (37) [그림 1] IE 인증서 신청 Form. 37. (38) CA command – option. 옵션. 설명. -config config_file. 환경 설정 파일을 default – openssl.cnf외에 다른 파일을 사용한다.. -in CSR. CSR 파일명. -ss_cert filename. self-signed certificate. -spkac filename. Netscape용 SPKAC 파일을 CSR로 인식한다.. -infiles file1, file2, …. 마지막 옵션으로 사용. –infiles 다음에 오는 파일들은 모두 CSR로 인식한다.. -out filrname. 생성될 인증서의 이름을 직접 적어준다.. -outdir directory. 인증서의 이름을 정의하지 않으며, “시리얼번호.pem”으로 자동 생성된다.. -cert certfile. CA 인증서 파일. -key password. CA 개인키를 암호화하는데 사용한 패스워드. -verbose. 인증서 생성 과정에서 메시지를 출력한다.. -batch. 메시지를 출력하지 않는다.. -notext. 인증서를 text로 화면에 출력하지 않는다.. -startdate UTC. 인증서의 유효기간 중 notBefore 필드를 정의한다.. -enddate UTC. 인증서의 유효기간 중 notAfter 필드를 정의한다.. -days. 인증서의 유효기간을 설정한다.. -md. 메시지 다이제스트 함수를 설정한다. 값이 없으면 openssl.cnf의 default_md로 설정된 값을 이용한다.. -policy. config 파일에 있는 policy section 중 사용할 section을 선택한다.. -preserveDN. (생성될) 인증서의 DN 순서와 policy section에 있는 DN 순서를 일치시킨다.. -extfile. 별도의 확장 필드 설정만을 포함하는 환경 설정 파일을 이용한다.. PKCS12 command. PKCS#12는 인증서와 개인키의 안전한 저장 방법에 대한 표준안이다. Netscape 4.04 이후 버전과 IE 4.0 이후 버전에서 지원되며, 인증서의 import와 export에 주로 사용된다. IE와 Netscape 간의 인증서와 개인키 공유에 유용하다. PKCS12 이전에는 PFX 타입을 사용했다 (PFX is a horrible, evil, broken predecessor to PKCS#12. It was invented by Microsoft who never really implemented it. Netscape Communicator 4.03 and earlier used it because PKCS#12 didn't exist at the time. For compatibility reasons Netscape 4.04 and later and all versions of MSIE support PFX on import only). PKCS12의 알고리즘. 38. (39) 128 bit RC4 with SHA1 40 bit RC4 with SHA1 3 key triple DES with SHA1 (168 bits) 2 key triple DES with SHA1 (112 bits) 128 bit RC2 with SHA1 40 bit RC2 with SHA1 DES with MD5 (56bit) DES with MD2 (56bit). Software. PKCS#12 import. PKCS#12 export. PFX Import. PFX export. Netscape 4.03 and earlier. No. No. Yes. Yes. Netscape 4.04 and later. Yes. Yes. Yes. No. MSIE 4.0 and later. Yes. Yes. Yes. No. [표 8] –info option을 이용하여 .p12 파일을 parsing [nrg:/src/secureca/test] openssl pkcs12 -in cho.p12 -info Enter Import Password:11111111 MAC Iteration 1 MAC verified OK PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048 Certificate bag Bag Attributes friendlyName: CHO’s Certificate localKeyID: DA 39 A3 EE 5E 6B 4B 0D 32 55 BF EF 95 60 18 90 AF D8 07 09 subject=/C=KR/ST=SEOUL/L=SEOUL/O=PKI/OU=PKI/CN=my_name/[email protected] issuer= /C=KR/CN=rootCA -----BEGIN CERTIFICATE----MIICkTCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQQFADAeMQswCQYDVQQGEwJLUjEP MA0GA1UEAxMGcm9vdENBMB4XDTAwMDIyODA3NTc0NFoXDTAxMDIyNzA3NTc0NFow fzELMAkGA1UEBhMCS1IxDjAMBgNVBAgTBVNFT1VMMQ4wDAYDVQQHEwVTRU9VTDEM MAoGA1UEChMDUEtJMQwwCgYDVQQLEwNQS0kxEDAOBgNVBAMUB215X25hbWUxIjAg BgkqhkiG9w0BCQEWE2J1Z2J1ZzcxQG5ldHNnby5jb20wgZ8wDQYJKoZIhvcNAQEB BQADgY0AMIGJAoGBAMRdKlbr+iW5rczgaXt/i3IIQEP4YTc/iaFvVopJeuGbi6IU 6Xb96PnT5W7ccKBpF/h2jy7CllzNlUzDX82h9yAKKEH1oqFz7jVaeWfIF4kjF4OW. 39. (40) tmpzi0en4omXWriLTlrZSbMMhOxgxkIKK3vsZz4o0HTWOlvSyo8WD+buDtszAgMB AAGjfjB8MB4GA1UdEQQXMBWBE2J1Z2J1ZzcxQG5ldHNnby5jb20wDAYDVR0TBAUw AwIBADA5BglghkgBhvhCAQ0ELBYqQ2VydE1nciA6IMWstvPAzL7wxq4gwM7B9byt uKYgu/28usfVtM+02S4gMBEGCWCGSAGG+EIBAQQEAwIHgDANBgkqhkiG9w0BAQQF AAOBgQAIcFLMnzd/I1B2pozGyyt0GfLeK8w/0farp6tmGKzEQL5e5e9nzo8BlEwQ vQ+H8I9v6FVLv2BBk/gmB+VAHO4JXR5kxTLLHCB+h5gFDZFXnQhxQfvvph5gyAaQ wWIQXtCMzWVq/lI72qF+TVJJp0jlh6UoYCjgRzZ7FZOxdHHydQ== -----END CERTIFICATE----Certificate bag Bag Attributes friendlyName: rootCA subject=/C=KR/CN=rootCA issuer= /C=KR/CN=rootCA -----BEGIN CERTIFICATE----MIICDjCCAXegAwIBAgIBADANBgkqhkiG9w0BAQQFADAeMQswCQYDVQQGEwJLUjEP MA0GA1UEAxMGcm9vdENBMB4XDTAwMDIyODA3NTQxNloXDTEwMDIyNTA3NTQxNlow HjELMAkGA1UEBhMCS1IxDzANBgNVBAMTBnJvb3RDQTCBnzANBgkqhkiG9w0BAQEF AAOBjQAwgYkCgYEA4jRa6YuNCx9AX8Pj5rn96HsbNGfMwVxmcVIdFy/F1bTR8rSP Y1Vgi4DQ8/u3QmM8qqQ2CJY6pqe+jT7tA8uk4U0Iws2+mG+zehlueGTBry0SbSHe y3DReaBoDXWLLKLtAs3QLNTAX2tU6AG/lSUOKgwnoTUD7Khj3gZ5v8kkoQsCAwEA AaNcMFowCQYDVR0RBAIwADAPBgNVHRMECDAGAQH/AgEAMCkGCWCGSAGG+EIBDQQc FhpTZWN1cmVTb2Z0IFByaW1hcnkgUm9vdCBDQTARBglghkgBhvhCAQEEBAMCAAcw DQYJKoZIhvcNAQEEBQADgYEA4JnUFQ1GxB324wXxnXVRKNTmyz1xaPnF+PQqsyCo LfwcGv5APBz1XLCr7gu70n/53TnHBLkV4Lu+8EAIUJ4ljjAp9VDIjoQAMcK1O8cy viUUkSA45FlHNqjpzX1GJ/Y/662xfK08NuFoU0/QmuXE7BKzWKFUzSkIQKz/2hXA tIY= -----END CERTIFICATE----PKCS7 Data Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048 Bag Attributes friendlyName: my_name localKeyID: DA 39 A3 EE 5E 6B 4B 0D 32 55 BF EF 95 60 18 90 AF D8 07 09 Key Attributes: <No Attributes> Enter PEM pass phrase:11111111 Verifying password - Enter PEM pass phrase:11111111. 40. (41) Software and mode.. Certificate encryption. Private key encryption. MSIE4 (domestic and export versions). 40 bit RC2. 40 bit RC2. All.. All.. 40 bit RC2. 3 key triple DES with SHA1. PKCS#12 export. MSIE4, 5(domestic and export versions) PKCS#12 import. MSIE5 PKCS#12 export.. (168 bits) Netscape Communicator (domestic and. 40 bit RC2. export versions) PKCS#12 export. 3 key triple DES with SHA1 (168 bits). Netscape Communicator (export version). 40 bit ciphers only.. All.. All. All. All. All. PKCS#12 import. Netscape Comminicator (domestic or fortified version) PKCS#12 import. OpenSSL PKCS#12 code.. CRL CRL을 생성한다. EXAMPLES. Convert a CRL file from PEM to DER: openssl crl -in crl.pem -outform DER -out crl.der Output the text form of a DER encoded certificate: openssl crl -in crl.der –inform der -text [nrg:/usr/local/securesoft/CA] openssl crl -in test.der -inform der -text Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: /C=KR/O=SecureSoft, INC./CN=SecureSoft Secure Server CA/[email protected] Last Update: Mar. 2 02:01:51 2000 GMT. Next Update: Apr. 1 02:01:51 2000 GMT. Revoked Certificates: Serial Number: 26 Revocation Date: Mar. 2 02:01:04 2000 GMT. Serial Number: 27. 41. (42) Revocation Date: Mar. 2 01:57:39 2000 GMT. Signature Algorithm: md5WithRSAEncryption 30:2d:43:5b:cb:57:cb:4b:7b:c4:5e:77:22:63:a6:93:96:52: 0a:37:1a:ef:59:16:48:6a:82:64:f2:d2:7a:36:98:60:8f:4a: … 5f:08:07:dd:c0:1a:c3:9d:7c:27:e4:0d:c5:a9:d5:f7:f1:e8: ba:9b:93:af:72:b6:17:8b:48:b0:15:5c:79:aa:13:a2:d4:0f: e3:9a -----BEGIN X509 CRL----MIIBYTCByzANBgkqhkiG9w0BAQQFADByMQswCQYDVQQGEwJLUjEZMBcGA1UEChMQ U2VjdXJlU29mdCwgSU5DLjEkMCIGA1UEAxMbU2VjdXJlU29mdCBTZWN1cmUgU2Vy … dyJjppOWUgo3Gu9ZFkhqgmTy0no2mGCPSv2ZEIcgcTTXUH158HltLfU279nz7/j4 MvZTI0FFTXFlvZlAo7bxzRDjJsMaGt7tO1c+yc+MbF8IB93AGsOdfCfkDcWp1ffx 6Lqbk69ytheLSLAVXHmqE6LUD+Oa -----END X509 CRL-----. Ex. Netscape에 install하는 경우 DER 타입만이 가능하다.. 42. (43) [표 9] Netscape에 설치된 CRL. 43. (44) req command EXAMPLES 인증서 신청서(CSR)를 테스트한다.. openssl req -in req.pem -text -verify –noout [nrg:/usr/local/securesoft/CA] openssl req -in req.pem -text -verify -noout Using configuration from /usr/local/ssl/openssl.cnf verify OK Certificate Request: Data: Version: 0 (0x0) Subject: C=kr, CN=Jinkyu Kim/[email protected] Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:b2:8d:fa:6d:c4:05:ce:04:a0:8a:3f:18:d9:f5: … cf:6c:85:5d:60:3c:39:ab:6a:52:80:86:90:78:1f: c8:28:11:54:75:ac:66:13:9f Exponent: 65537 (0x10001) Attributes: unstructuredName. :1111111. challengePassword. :jkkim. Signature Algorithm: md5WithRSAEncryption a5:49:6c:c8:d0:9f:21:1a:fa:43:fe:a0:c3:44:f3:5b:f9:c4: 76:66:53:1c:d7:2a:57:90:b7:0e:28:db:a3:98:62:b3:88:58: … 5e:d6:8c:23:0b:9c:89:1a:d9:c5:fe:35:a1:53:67:93:f1:81: fb:cd. 개인키를 생성하고 이 개인키를 이용하여 인증서 신청서를 생성한다. :. openssl genrsa -out key.pem 1024 [nrg:/usr/local/securesoft/CA] openssl genrsa -out key.pem 1024 Generating RSA private key, 1024 bit long modulus ...................................++++++. 44. (45) ...........++++++ e is 65537 (0x10001). openssl req -new -key key.pem -out req.pem [nrg:/usr/local/securesoft/CA] openssl req -new -key key.pem -out req.pem Using configuration from /usr/local/ssl/openssl.cnf You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:kr … Common Name (eg, YOUR name) []:jkkim Email Address []:[email protected]. Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:11111111 An optional company name []:jkkim. 위의 두 가지 명령을 하나로:. openssl req -newkey rsa:1024 -keyout key.pem -out req.pem [nrg:/usr/local/securesoft/CA] openssl req -newkey rsa:1024 -keyout key.pem -out req.pem Using configuration from /usr/local/ssl/openssl.cnf Generating a 1024 bit RSA private key ...................................++++++ ..........................++++++ writing new private key to 'key.pem' Enter PEM pass phrase:11111111 Verifying password - Enter PEM pass phrase: 11111111 ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN.. 45. (46) There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:KR State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:. Organization Name (eg, company) [Internet Widgits Pty Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (eg, YOUR name) []:Jinkyu Kim Email Address []:[email protected]. Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:11111111 An optional company name []:jkkim. 자가 서명(self-signed)된 root 인증서를 생성한다.. openssl req -x509 -newkey rsa:1024 -keyout key.pem -out req.pem. [nrg:/usr/local/securesoft/CA] openssl req -x509 -newkey rsa:1024 -keyout key.pem -out req.pem Using configuration from /usr/local/ssl/openssl.cnf Generating a 1024 bit RSA private key ...++++++ .....................................................++++++ writing new private key to 'key.pem' Enter PEM pass phrase:11111111 Verifying password - Enter PEM pass phrase: 11111111 ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:kr State or Province Name (full name) [Some-State]:.. 46. (47) Locality Name (eg, city) []:. Organization Name (eg, company) [Internet Widgits Pty Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (eg, YOUR name) []:rootCA Email Address []:.. 다음과 같이 인증서가 생성된다.. -----BEGIN CERTIFICATE REQUEST----MIIB3DCCAUUCAQAwazELMAkGA1UEBhMCa3IxDDAKBgNVBAgTAzEyMzEMMAoGA1UE BxMDMTIzMQwwCgYDVQQKEwMxMjMxDDAKBgNVBAsTAzEyMzEMMAoGA1UEAxMDMTIz MRYwFAYJKoZIhvcNAQkBFgcxMjNANDU2MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB iQKBgQCwqJSUdkdSOFbm3TEoRnXT/gMxrCXt6ODYA6iHllXcCz8LWRrlkABFVMe9 Oqq7baZDXcK3RaFgsG68XW6WRUmSfJD2GZDDA14nkBf52XxArJqSBf6ZUoQXRQM8 6KhCWaoSVxDN5P/IghC8q89fFoFlBkC9kEcK/iADW2Z0fyaoFwIDAQABoDEwFQYJ KoZIhvcNAQkCMQgTBjEyMzEyMzAYBgkqhkiG9w0BCQcxCxMJMTIzMTIzMTIzMA0G CSqGSIb3DQEBBAUAA4GBAH5RXLEzQj82YeMpzzt3m4zXV+sOSI5nm93bNFUV1Jev p/CHSePWr0igan/yIODgbIQujWxfkyV7MJXwehanMti1PIGDU2BR4x/KxmRy3L5h z5dqLsLYGCgVN/9ezPHBDdN4nzcISCTiwK+Od04XaF3ivL+Z0jtJdoFjsr4Fk/zY -----END CERTIFICATE REQUEST-----. Header와 footer로. -----BEGIN NEW CERTIFICATE REQUEST--------END NEW CERTIFICATE REQUEST---를 사용하는 프로그램도 있다. (ex. Netscape Certificate Server). 47. (48)

Referensi

Dokumen terkait

material shall include the name of the project, name and contact details of the suppler, FSC registration code, and for full project certification, the cost and/or volume

NO CONTINENT COUNTRY CITY / PROVINCE NAME OF THE HOSPITAL ADDRESS TELEPHONE DAFTAR RUMAH SAKIT REKANAN SUN MEDICAL PLATINUM PLAN A - AGUSTUS 2017.. 106 ASIA INDONESIA BEKASI

20 City Kermanshah Province Kermanshah Postal code 6719987945 Phone +98 83 3827 8666 Email [email protected] Person responsible for updating data Contact Name of

City Tehran Province Tehran Postal code - Phone +98 21 8895 5569 Email [email protected] Person responsible for updating data Contact Name of organization / entity Tehran

City Shahroud Province Semnan Postal code 3614773955 Phone +98 23 3239 3811 Email [email protected] Person responsible for updating data Contact Name of organization / entity

City Tabriz Province East Azarbaijan Postal code 5142954481 Phone +98 41 3337 8093 Email [email protected] Person responsible for updating data Contact Name of organization /

Main Condition: The User should fill up these things: Full name Email address Mobile number State Name Current Living Country Vital Fact: To act as a user , a person should

Application form specifying candidate’s full name and numeric code of chose specialty in accordance with the enclosed «Nomenclature of Specialty of Scientific Staff» for postgraduate