2008. 10. 3. 20:28

[OpenSSL] Command Line

 

 

OpenSSL Command Line

 본 문서는 OpenSSL 0.9.8e 23 Feb 2007으로 작업을 했다. 처음에는 마소예제를 보고 따라해봤으나..

안되는 부분이 너무 많았다. 인증서 인증부분도 그렇고...공개키 추출에 대한 것도 없고...

결국 가장 정확한 해결책은 google과 openssl사이트밖에 없다는....

 


1 . 자신의 요청할 인증서 생성


-> openssl req -config ntt.cnf -new -keyout [KeyFileName].pem -out [ReqCertFileName].pem -days 365 -batch -nodes

 

  • -nodes는 pem password를 설정하지 않는다. (2파트에서 설명)
  • -batch는 DN정보를 묻지 않고 default값으로 바로 넣어준다는 의미의 옵션이다.

2.  패스프레이즈 제거


위에서 -nodes 옵션을 사용하여 인증서를 생성하면 개인키는

 

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCqyuuherCzCfephhgod8hNvfACLgeU1r0qFAXxFOTffTXa8BRA
uqRBb38ZK13gwl7wg1umvmGZ68I+TGs95b3YVLZTpSEFdMpMv5Vp60+5TByjhJRd
zK0BQ115MdDG97lq02zD3RqRY3mSlP1P8i06NNR3hZTpP1WOIhHFiaHjBwIDAQAB
AoGBAI+pPGaJ4xPWcIIiDzQK/WuXNsk+mpXxwxAf45eT8aijk6djhkWkOQHpnUk4
lzC1jlJUy8UIIuTr0GnCsfpQw0xSdXq4M8qg6f9/iDRbIJjP2XwfTzLcSJSJEs6f
/jtQwFkU7t4w+blrFJBBQ4Un1soSJ8yBWXPplnoVzc9TRd6BAkEA2cLq/11cSIjm
fTe4FyjVm4JxDBa/3mkhYdSnc+ZZs1EQ8MIb091oxEkmJi36kpMKxdjOPi8sqy1H
wcKwDoyjpwJBAMjImuVkilymvwQJb6WY0sPwLLChH5msoMM7OvW0IiuxvoNPEsW5
5sbbhHhzogm8mNiHxi1fhsnGKPN77fTEMaECQHZb2GjGMNOH/WdP8rI70qZ8pr9A
WjckAy3ubLm1GUo6pK+HgaKNNFWDwMV9tjUW0QMqTSdFcszzho4NKK4vyP8CQHJb
h5Wl2QSCWINlGHj5/Plqfxmu+3+ciggIYUF2covudbL2Q5vokR+sAdxVB/KBv5B8
bIyFPxEHU2WyrUpewGECQDUiaFAvvKLwbQTTRFj/4l/zzM7TR/etIFtAcDYX4Ci5
3qlTL1MOCWtQtiAGPDRP8vRIzPkTuqcj6Qnk4ZYMSL4=
-----END RSA PRIVATE KEY-----
 

형태가 나온다..이는 순수한 개인키로써 사용이 바로 가능하다....보안면에서 떨어지겠지만...

그 반대로 -nodes를 제거하고 실행하면 생성된 개인키는 순수한 개인키가 아니게 된다.

내부를 보면

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,2C7153C4AAA59608

ppx00yME/E+1PTcu1+KUeq45a+9lJJJmQYEAjgfba2EinLheCjfhuhcJG6NqnMVG
aOLDWTOGFsQEc4g3vYIPmbdmeu5GccaexAPAzX3pw1PUu32qo0BHLZlnw4y0DOnp
HJkpVTVKsbUP6F1M0bRRyo3RIfYggOd+8QsMqdKqWYZIhAxZHD26ClOTkWVBIrX6
LbgTgIadjmoeo2+PUC24XYpL046xrrr84c0woELSPxnRZPZUcG3h85OCMzbKVwCO
b0+r9qaLtOjTmru+x62USzlAVvcggaYy6ixCLOHIHn82bVglmzQNzpawIQ+JXL/3
g//rlzk91ziFD0dOiJ5YcHohxyU9Do3rzVJv0jrCET/OV+inb80ys2mJNm2yrwIK
Ms613OlWnV8wDtVrTMUiov3LSjlWD4VBkMMNisttj9JM8cVkdpGveOgeBt01Lzf5
FNC6Poy98h1Z7dQ47L+W5xinCJEhnHiNdvI418+qSCvb4NS/+6ZYj/W9QvnTDB42
n+JXP1Qo/1wvNj3G2Xma5twB+MdOoWRFBXRvSvDbMtoyxouZLQwgNx1mPpm/GsmQ
5qUJx/yLSN7KgPTK08285Bj+Km5+Z7AA7PU5kklfQgSKUe3VZI+BiXFTXjjRyaU/
2kI4XwQel3DWXX741PiGzydx4dTlivHf3Fl8wEfXVrfC75DBebhSm/Pq1kwdIrb9
PsAmGojPKxf5Ye0AviqYVG8SZ8Vm1/JLwJeHv4WkDFEieQBFtcYXojVcl/TMisIY
18DiWCU4TxrCQuaV5eX0eYdsZslNxkRsr+aY7BekYdbaBaI2/370qw==
-----END RSA PRIVATE KEY-----

 위에

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,2C7153C4AAA59608

이 부분이 있는 것을 볼 수 있는데. 이는 passpharse으로 암호화한 것이다. 즉 개인키파일을 암호화 한 것이다.

이 것은 바로 개인키로써 사용 할 수 없으면 사용시 passpharse를 제거후에 개인키로써 사용이 가능하다.

제거 방법은..

openssl rsain rootkey.pemout rootkeys.pem

을 사용하면 되고 제거하지 않은 파일을 개인키로 사용한다면

PEM_read_bio_RSAPrivateKey()

에서 에러가 날 것이다...즉..개인키가 아닌 셈이다...암호화 된 개인키이니...못 쓸 수 밖에...^^

 

- 참조 사이트


 3. 요청 인증서 인증하기


-> openssl ca -config ntt.cnf -batch -policy policy_anything -out [인증한 파일이름].pem -infiles [인증할 요청인증서].pem

 

바로 명령어가 나왔다..ㅎㅎ 자세한 사항은 configuration파일을 들여다 보시길..간단하니...

 


 4. root 인증서 발부


-> openssl req -x509 -config rootca.cnf -newkey rsa:1024 -keyout [root인증서이름] -out [rootkey파일이름].pem -outform Pem -nodes

 

root인증서에 대한 인증은 누가 할까??? 라는 의문이 있었다..다른 root인증서버가 한다..

자세한 내용은 마소 자료에 있으니 참조 하자..^^

따로 존재하는 rootca.cnf라는 configuration파일이 따로 존재한다. 내부를 보면 대충 차이점을 알 수 있을 듯..

마소자료를 참조하자...잘 나와있다..

1.OpenSSL_암호화_프로그래밍_첫걸음.pdf

2.OpenSSL_API를_이용한_비밀키_암호화,_MD_프로그래밍.pdf

3.OpenSSL_API를_이용한_공개키_암호화.pdf

4.OpenSSL_API를_이용한_인증서,_SSL_프로그래밍.pdf

 


5. 인증서에서 공개키 추출


인증서에서 공개키를 추출하는 옵션은 안타깝게도 없다..많은 google의 관련 메일에서 세계 여려사람들이

불만을 하소연하고 있더라..ㅡㅁㅡ 그중에 나도 한명...

만일 아는 분 있으면 방명록으로~~쑤웅~~

 

일단 명령어을 보자.

 

openssl x509 -in rootcert.pem -pubkey -noout >pubkey.pem

 

rootcert라는 인증서에서 공개키를 빼자라는 -pubkey가 있다.하지만 실행해보면 커멘드 상으로 출력해 줄뿐

파일로 나올 수 있는 옵션은 없다..-outfile인가...그걸 쓰면 되도안하는 인증서에 대한 정보가 저장이 되어 버린다.

결국. >로....

 

-noout는 커멘트상에서는 보여 주지 않겠다는 옵션이다..

 

만일 windows프로그램상에서 createprocess로 실행할려면...파이프 통신으로 >대신 파일에 대한 정보를

읽어와 파일로 써야 한다.

아래와 같이...

do
 {
    res=::ReadFile( rPipe, buf, 100, &reDword, 0 );
    csTemp=buf;
//    pList->AddString( (CString)buf );
    m_csOutput+=csTemp.Left( reDword );
 }while(res); 

 근데..어떤사람은 system함수로 한방에 하는 사람도 있던데...난 해보지 않았다..한번 해보시길..


 마치며


좀더 많은 자료는 참조링크한 사이트에 많이 있다..


참조 : http://www.madboa.com/geek/openssl/

참조 ppt : OpenSSL_인증서발부법.ppt