keytool과 openssl
[출처]OpenSSL로 인증서 생성 및 변환 간략 정리|작성자시피
인증서는 종류도 참 많고 인증하는 법도 다양하고 알고리즘도 다양하고 WAS설정이나 기타 변수등에 따라서 다른써야하고...
참 드럽게 복잡하다.
1.keytool
인증서를 관리하는 툴이다. 결코 인증서를 만드는 그런 툴이 아니다. JDK1.6에 기본으로 포함되어 있으면 다루기도 아주 간단하다.
그전에 keystore에 대한 개념을 알아야 한다.
윈도우에서 mmc로 들어가서 스냅인에 인증서를 추가하면 기존에 있었던 인증서와 인증기관 관련된 사항들이 모두 보여진다. 윈도우는 이곳에서 모든 인증서를 관리하고 있다는 것을 한눈에 알수 있다. 하지만 java는 jvm이 있는 모든 머신에서 돌아가야 하기 때문에 윈도우와 같은 특정 OS에서 사용되는 인증관리도구를 사용하지 않는다. 따라서 java는 keystore라고 하는 인증서 저장소에서 모든 인증서를 관리한다. 즉, java 코딩을 하면서 인증서가 적용된 ssl통신이나 인증관련 코드를 작성하고 실행할려면 keystore에 해당 인증서가 등록되어 있어야 한다는 것이다(인증서파일을 직접 스트림으로 읽어서 사용한다면 등록안해도 상관없다). keystore에는 딱 한개가 아닐수도 있으며 keystore에 들어가는 인증서가 꼭 한개인 것도 아니다. 하나의 keystore에 여러개의 인증서가 들어갈 수도 있고 java는 여러개의 keystore를 가질 수도 있는 것이다.
아래 명령어들은 그동안 프로젝트를 하면서 사용했었던 명령어이다. (keystore의 디폴트 암호는 대부분이 changeit이다.)
keytool -list -keystore "C:\Program Files\Java\jdk1.6.0_21\jre\lib\security\cacerts" -storepass changeit -alias ubif.ubware.com-1 | more
keytool -importcert -alias ubif.ubware.com-1 -file "c:\result.crt" -keypass yoon3304 -keystore "C:\Program Files\Java\jdk1.5.0_22\jre\lib\security\cacerts" -storepass changeit
keytool -exportcert -alias ubif.ubware.com-1 -file c:\result2.crt -keystore "C:\Program Files\Java\jdk1.6.0_21\jre\lib\security\cacerts"
keytool -delete -alias ubif.ubware.com-1 -keystore "C:\Program Files\Java\jdk1.5.0_22\jre\lib\security\cacerts" -storepass changeit
기본적으로 JAVA_HOME/jre/lib/security/ 폴더 안에 cacerts라는 keystore파일을 가지고 있다.
첨부된 InsertCert를 사용하면 jssecacerts라는 파일이 생기는데 이것 또한 keystore파일이다. keytool을 이용하여 따로 importkeystore하지 않는다면 그냥 jssecacerts파일을 JAVA_HOME/jre/lib/security/ 안에 옮기면 자동으로 keystore가 등록이 된다.
컴파일은 알아서 할거라 생각하고 실행방법만 간단히 설명한다면
java InstallCert test.myweb.com
위 test.myweb.com에 https보안이 된 주소를 적어주면 InsertCert는 알아서 keystore를 생성하고 그 안에 test.myweb.com에서 제공하는 인증서를 저장해준다. 우리는 그렇게 나오느 jssecacerts라는 파일을 그대로 사용하면 되는 것이다.
2.openssl
openssl은 테스트용 인증서를 만들 수 있는 툴이다. 실서버에서 사용할 때는 반드시 공인된 인증기관에서 발급하는 인증서를 사서 써야한다(이것이 꽤나 비싸고 번거롭다.대부분의 인증기관에서 30일 Trial버전을 제공하고 있다).
openssl로 직접 인증기관을 생성할 수도 있고 그 인증기관에서 발급하는 것처럼 해서 인증서 또한 만들 수 있다.
openssl req -new -out test-server.csr
openssl rsa -in privkey.pem -out test-server.key
openssl x509 -in test-server.csr -out test-server.crt -req -signkey test-server.key -days 365
OpenSSL로 인증서 생성 및 변환 간략정리
테스트 용도 및 내부 어플리케이션 사용 용도라면 굳이 돈주고 Verisign 인증서 같은걸 사서 쓸 필요 없이 간단히 OpenSSL로 만들어 사용하는 것도 좋은 방법이지요.
인증서란 것이 발급한 기관이 어디냐에 따라서 브라우저 같은 Application에서 그냥 넘어가느냐 못믿을 놈이니 확인해라 라는 컴플레인을 하거나의 차이일 뿐 표준에 따라 만드는 것이라 다를 것이 없으니까요....
로 인증서 생성 및 변환하는 것을 아주 간략히 정리해봅니다.
OpenSSL을 설치하면 openssl 이라는 이름의 실행파일이 있으며 이는 OpenSSL 패키지에 대한 데모 및 샘플 코드 제공, 각종 암호키에 대한 변환 등의 기능을 제공하는 툴입니다.
이 툴로 사실 우리가 필요로 하는 거의 대부분의 키 핸들링이 가능하다고 볼 수 있습니다.
1. Demo CA 설정
현재 디렉토리에 demoCA 디렉토리 생성 : mkdir demoCA
demoCA 디렉토리 안에 시리얼 파일 생성 : serial 이란 이름의 text 파일에 00 을 적는다.
index 파일 생성 : index.txt 란 이름으로 빈 파일을 만든다.
2. CA 인증서 생성
CA 개인키 생성 : openssl genrsa -des3 -out ca.key 1024
Self-Signed CA 인증서 생성 : openssl req -new -x509 -days 365 -key ca.key -out ca.crt
3. 하위 인증서 생성 (예: HTTPS Web 서버용..)
server 개인키 생성 : openssl genrsa -des3 -out server.key 1024
server 인증서 발급을 위한 요청파일 생성 : openssl req -new -days 365 -key server.key -out server.csr
server 인증서 발급 : openssl ca -in server.csr -out server.crt -keyfile ca.key -cert ca.crt -outdir .
위 작업의 결과로 server.crt 라는 server용인증서가 생성되고 index 파일에 발급내역이, serial이 16진수로 1씩 증가한다.
4. 인증서 인코딩 포멧 변경
openssl 이 생성하는 인증서의 인코딩은 발급 시 옵션을 주지 않으면 디폴트가 PEM (base64 encoding)이다.
Java 등에서 사용하기 위한 DER 포맷(바이너리)으로 변경은 다음과 같이 수행한다.
: openssl x509 -in ca.crt -out ca.der -outform DER
5. 인증서 내용 보기
openssl x509 -in ca.crt -text (PEM 포맷인 경우)
openssl x509 -in ca.der -inform DER -text (DER 포맷인 경우)
=========================================================================================================------------------------------------------------------------------------------------------
CA 개인키 생성
openssl genrsa -des3 -out ca.key 1024
CA csr 키 생성
openssl req -new -key ca.key -out ca.csr
Root CA 인증서 생성
openssl x509 -req -days 1280 -in ca.csr -signkey ca.key -out ca.crt
개인키에서 패스워드 삭제하기
openssl rsa -in ca.key -out ca_key.pem
Server 개인키 생성
openssl genrsa -des3 -out server.key 1024
Server csr 키 생성
openssl req -new -key server.key -out server.csr
Server 인증서 생성
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey
ca.key -CAcreateserial -days 365
개인키에서 패스워드 삭제하기
openssl rsa -in server.key -out server_key.pem
Client 개인키 생성
openssl genrsa -des3 -out client.key 1024
Client csr 키 생성
openssl req -new -key client.key -out client.csr
Client 인증서 생성
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA server.crt -CAkey
server.key -CAcreateserial -days 365
개인키에서 패스워드 삭제하기
openssl rsa -in server.key -out server_key.pem
crt->der 포맷변경
openssl x509 -in ca.crt -out ca.der -outform DER
pem->der 포맷변경
openssl x509 -in demoCA/cacert.pem -outform DER -out cacert.der
der->pem 포맷변경
x509 -in cert.cer -inform DER -out cert.pem -outform PEM
인증서 확인
openssl x509 -noout -text -in client.crt
비밀키 보기
openssl rsa -noout -text -in server.key
openssl 설치완료 확인
httpd -t
pfx 변환
openssl pkcs12 -export -in client.crt -inkey client.key -certfile ca.crt -out bundle.p12
pfx에서 키 추출
OpenSSL> pkcs12 -in filename.pfx -nocerts -out key.pem
pfx에서 인증서 추출
OpenSSL> pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
라디우스 실행
/usr/local/sbin/radiuse -x
인증에 사용될 파일 6개
ca_key.pem ca.crt
server_key.pem server.crt
client_key.pem client.crt