성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>자바의 keytool.exe 사용법과 Tomcat의 SSL 통신 설정</h1> <p> 닷넷의 경우, 운영체제와 통합되어 있어서 윈도우 자체의 인증서 저장소를 사용하는 것이 보통입니다. .cer 또는 .pfx 확장자를 가진 파일을 탐색기에서 더블 클릭해서 등록하거나, 세심하게는 MMC 콘솔을 이용해서 인증서를 관리하게 되는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 인증서 관리 - 인증서 MMC 관리자 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/395'>http://www.sysnet.pe.kr/2/0/395</a> </pre> <br /> 자바의 경우에는 어떨까요? 아무래도 다중 플랫폼을 지원해야 하다 보니 직접적인 '키 저장소'를 단일 파일 하나로 관리하는 방법을 제공하고 있습니다.<br /> <br /> 그리고, 그 관리는 JRE/JDK를 설치한 /bin 폴더의 keytool.exe가 담당합니다.<br /> <br /> 예를 들어, 현재 키 저장소에 담겨있는 키들을 확인하려면 다음과 같이 명령을 내리면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files\Java\jdk1.6.0_19\bin><span style='color: blue; font-weight: bold'>keytool -list</span> keytool 오류: java.lang.Exception: keystore 파일이 없습니다: C:\Users\SeongTae Jeong\.keystore </pre> <br /> 아하... 그런데 기본적으로 ".keystore"라는 파일이 존재하지 않는 군요. 게다가 ".keystore" 파일이 있는 위치가 운영체제 별로 다른데 이에 대해서는 다음의 글을 참고하시고.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keystore : Java Glossary ; <a target='tab' href='http://mindprod.com/jgloss/keystore.html'>http://mindprod.com/jgloss/keystore.html</a> </pre> <br /> 윈도우라면, 한 가지 예외적인 경우가 있는데 바로 해당 PC가 "Active Directory"에 참여했으면 경로가 다음과 같이 바뀝니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > \\[AD 컴퓨터이름]\Users$\[사용자]\.keystore </pre> <br /> 즉, "AD 계정"으로 로그인한 사용자는 하나의 PC에서 키 저장소를 만드는 명령을 내렸다면 다른 모든 PC에서 공유되는 것입니다.<br /> <br /> 자, 그럼 keytool.exe를 이용해서 키 저장소를 만들어 볼까요? 사실 키 저장소만을 만드는 방법은 없고 '최초의 키'를 만들 때 자동적으로 '저장소'는 만들어집니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files\Java\jdk1.6.0_23\bin><span style='color: blue; font-weight: bold'>keytool -genkey</span> -alias tomcat <span style='color: blue; font-weight: bold'>keystore 암호를 입력하십시오: 새 암호를 다시 입력하십시오:</span> 이름과 성을 입력하십시오. [Unknown]: jennitest 조직 단위 이름을 입력하십시오. [Unknown]: 조직 이름을 입력하십시오. [Unknown]: 구/군/시 이름을 입력하십시오? [Unknown]: 시/도 이름을 입력하십시오. [Unknown]: 이 조직의 두 자리 국가 코드를 입력하십시오. [Unknown]: CN=jennitest, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown이(가) 맞습니까? [아니오]: y <span style='color: blue; font-weight: bold'><tomcat>에 대한 키 암호를 입력하십시오. (keystore 암호와 같은 경우 Enter를 누르십시오):</span> </pre> <br /> 실행된 결과를 보면, "KeyStore 암호"와 나중에 "키 암호"를 구분해서 받고 있습니다. 그 외의 것들은 윈도우에서도 인증서 발급받을 때와 동일하게 입력하는 것들이니 낯설지는 않습니다. ("이름과 성"을 입력하는 부분에서 웹 사이트의 SSL 키로 사용하고 싶다면 사용자가 웹 브라우저에 입력해서 들어가는 "웹 사이트 DNS 이름"을 적어주어야 한다는 것은 잊지 마시고. ^^)<br /> <br /> 실제로 잘 들어갔는지 확인해 볼까요?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files\Java\jdk1.6.0_23\bin><span style='color: blue; font-weight: bold'>keytool -list</span> keystore 암호를 입력하십시오: Keystore 유형: JKS Keystore 공급자: SUN Keystore에는 1 항목이 포함되어 있습니다. tomcat, 2011. 9. 22, PrivateKeyEntry, 인증서 지문(MD5): 0F:8D:26:B3:DE:47:63:D2:89:74:63:45:B2:1F:55:54 </pre> <br /> 다시, 인증서를 삭제하려면 다음과 같이 '-delete' 옵션을 해줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\j2sdk1.4.2_11\bin><span style='color: blue; font-weight: bold'>keytool -delete</span> -alias tomcat keystore 암호를 입력하십시오: 000000 </pre> <br /> keytool.exe의 명령행 인자를 적절하게 이용하면 질문/답변 식으로 이어지는 항목들을 줄일 수가 있는데요. 예를 들어, 다음과 같이 명령행에서 미리 지정해 주면 입력받는 절차를 완전히 생략할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keytool -genkey -alias tomcat -dname "CN=jennitest" -storepass 000000 -keypass 000000 </pre> <br /> 키 목록을 보는 것도 역시 다음과 같이 해주면 되고.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keytool -list -storepass 000000 </pre> <br /> 기본적으로, .keystore 파일은 운영체제 종류에 따라 지정된 위치에 생성이 되는데요. 실제 서비스를 할 때에는 닷넷에서와 동일하게 문제가 발생할 여지가 있습니다. 바로, .keystore 파일이 "사용자 계정" 명에 따라 파일 위치가 결정된다는 점인데, 만약 "Local SYSTEM" 계정으로 톰캣이 실행된다면 해당 .keystore 파일을 찾을 수 없게 됩니다. 이를 위해 .keystore 파일을 원하는 위치에 생성하는 기능이 keytool.exe에서 제공됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keytool <span style='color: blue; font-weight: bold'>-keystore c:\temp\all.keystore</span> -genkey -alias tomcat -dname "CN=jennitest" -storepass 000000 -keypass 000000 </pre> <br /> 이렇게 생성된 키 저장소를 대상으로 목록을 보여주고 싶다면 파일 경로를 같이 지정해 주어야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keytool -list -storepass 000000 <span style='color: blue; font-weight: bold'>-keystore c:\temp\all.keystore</span> </pre> <br /> keytool.exe에 대해서 이 정도만 알아두셔도 충분하겠지요. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 다음으로, 톰캣에 SSL 통신을 가능하게 하려면 어떻게 해야 할까요? 쉽게는 위에서 설명한 keytool.exe를 사용하여 생성한 키를 이용하는 방법이 있지만, 여기서는 인증 기관에서 발급받은 인증서가 있다고 가정하고 진행해 보겠습니다.<br /> <br /> 경험상 verisign 같은 인증 기관으로부터 인증서를 발급받게 되면 보통 .cer 파일을 보내주었던 것 같습니다. 물론, 그렇게 해서 구한 유료 인증서를 가지고 테스트하면 더욱 현장감 있겠지만 ^^ 여기서는 단지 실습을 해보자는 것이므로 다음과 같은 방법으로 자작(self) 인증서 파일을 대상으로 작업을 해보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 인증서 관련(CER, PVK, SPC, PFX) 파일 만드는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/863'>http://www.sysnet.pe.kr/2/0/863</a> 윈도우에서 (테스트) 인증서 파일 만드는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/863'>http://www.sysnet.pe.kr/2/0/12013</a> </pre> <br /> 위의 글에 따라 pfx 파일을 생성해야겠지요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > makecert -n "CN=<span style='color: blue; font-weight: bold'>mytestpc</span>" -r -sv mycert.pvk mycert.cer cert2spc mycert.cer mycert.spc pvkimprt -pfx mycert.spc mycert.pvk ==> mycert.pfx 결과 파일 생성 (<span style='color: blue; font-weight: bold'>비밀번호 0000</span>) ==> "CN=[웹 사이트 DNS명]"에서 저는 테스트 PC인 mytestpc로 정했습니다. </pre> <br /> 자, 이제 mycert.pfx 파일 가지고 어떻게 해야할까요? 잠시 웹 검색을 해보니, 다음과 같은 글이 나오더군요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Importing PFX files into Java keystores ; <a target='tab' href='http://i-proving.ca/space/Technologies/JCE/Importing+PFX+files+into+Java+keystores'>http://i-proving.ca/space/Technologies/JCE/Importing+PFX+files+into+Java+keystores</a> </pre> <br /> 즉, 인증기관으로부터 받은 .pfx 파일을 .cer 파일로 변경해서 저장한 다음 아래와 같은 명령어를 이용해서 .keystore에 저장하라는 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > keytool -import -alias joe -keystore my.keystore -file my_recently_exported.cer </pre> <br /> 저렇게 import한 키를 가지고 tomcat의 SSL 통신에 사용할 수 있을까요? 대답은 '아니오'입니다. pfx 파일과 cer의 주요한 차이점은 바로 '개인키'를 보유하고 있느냐의 여부인데요. '개인키'가 없는 cer 파일을 .keystore에 가져오기 하면 당연히 '공개키'만 들어있다는 것인데 그런 상태로는 SSL 세션을 열 수 없습니다.<br /> <br /> 즉, 위의 방법은 엄밀히 말해서 "pfx 파일에서 개인키를 빼고 .keystore에 저장하는 방법"을 설명하는 글이라고 보시면 됩니다.<br /> <br /> 그럼 어떻게 pfx 파일에 대해 '개인키'를 유지한 체로 .keystore에 저장할 수 있을까요? 음... 그 부분은 잘 모르겠습니다. ^^; (혹시, 아시는 분 댓글 부탁드립니다.)<br /> <br /> 대신에, tomcat의 SSL 통신을 위해 pfx 파일을 .keystore에 담아야 할 필요가 없다는 사실은 알게 되었습니다. 즉,"[tomcat 설치 폴더]/conf/server.xml" 파일에 곧바로 pfx 파일을 지정할 수 있는 방법이 제공되고 있는데요.<br /> <br /> server.xml을 열면, 아래와 같은 Connector 노드가 주석처리되어 있는 것을 찾을 수 있는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> </pre> <br /> 이를 주석 해제하고, 다음과 같이 pfx 파일을 연결해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" <span style='color: blue; font-weight: bold'> keystoreFile="d:\tools\cert\mycert.pfx" keystorePass="0000" keystoreType="PKCS12"</span> /> </pre> <br /> 준비는 이걸로 끝입니다. 이제 웹 브라우저를 이용해서 "https://localhost:8443/"라고 방문하면 아래와 같은 화면이 나오는데요.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='java_key_store_1.png' src='/SysWebRes/bbs/java_key_store_1.png' /><br /> <br /> 이러한 화면이 나오는데에는 2가지 오류가 있다는 것을 보여주고 있습니다.<br /> <br /> <ol> <li>The security certificate presented by this website was not issued by a trusted certificate authority.</li> <li>The security certificate presented by this website was issued for a different website's address.</li> </ol> <br /> 첫 번째 오류를 피하려면, 테스트에 사용된 mycert.pfx를 "Trusted Root CA"에 등록해 주면 되는데, 물론 Verisign 같은 CA에서 받은 인증서라면 이 단계의 오류는 발생하지 않습니다. 두 번째의 경우에는 웹 사이트에 입력된 "localhost"라는 주소가 mycert.pfx에 지정된 "CN=mytestpc"이름과 다르기 때문에 나타나는 것입니다.<br /> <br /> 따라서, 루트 인증 기관에 등록된 상태에서 "https://mytestpc:8443"으로 입력하면 곧바로 정상적인 서비스를 받을 수 있습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9242
(왼쪽의 숫자를 입력해야 합니다.)