먼저, 회사 SVN 서버로 CollabNet Subversion Edge를 사용하고 있는데

이 제품은 기본적으로 SSL을 지원하도록 되어 있다.


(서버 설정 화면에서 https 설정을 체크하기만 하면 된다.)


문제는,

이 때 사용되는 인증서는 자체 서명(Self-Signed) 인증서로,

SSL 인증서 발급 기관이 공인 인증된 루트 인증기관이 아니기 때문에

클라이언트 웹 브라우저에서 그냥 경고를 무시하고 허용하고 쓰기에는 별 문제가 없지만

TMG 등의 방화벽/게이트웨이 솔루션을 통해 웹 게시(Publishing) 등을 하는 경우에 문제가 생긴다.



특히 TMG에서는 네트워크 어댑터 별로 HTTPS 포트 당 한 가지 인증서만 사용할 수 있는데

이미 사내에 메일 서비스 등 HTTPS 서비스를 하고 있기 때문에

TMG에서는 와일드 카드(*) 인증서를 이용해서 각 서비스 별로 인증서를 따로 쓰더라도

별 문제 없이 통과되도록 구성해서 쓰고 있다.


각설하고,

(이 부분은 상당히 고수준의 방화벽, SSL, 인증서 등에 대한 관련 지식이 필요한 내용이라

자세히 설명하려면 엄청 길어지므로 대충 이 정도로 하고 생략한다.)



아무튼 SVN에서 TMG를 통해 SSL 서비스를 하려면

위와 같은 이유로 같은 인증기관에서 발급된 인증서가 있어야만 서비스를 할 수 있는데

자체 서명 인증서를 사용하고 있는 이상 SVN에서 HTTPS 서비스를 정상적으로 제대로 할 수 없다.

(물론, 할 수는 있다. 웹 브라우저에서 늘 경고가 뜨는 것을 감수한다면.

또, TortoiseSVN 같은 클라이언트를 쓰면 한번만 처음 한번만 허용해 주면 경고 없이도 쓸 수 있다.)


(이런 경고창이 항상 뜬다.)


이를 제대로 풀기 위해 SVN 서버의 인증서를 TMG에서 정상적으로 통과될 수 있는

다른 인증기관 인증서로 바꾸는 방법에 대해 몇 자 적어 본다.



먼저, 이미 CollabNet 위키에 인증서를 바꾸는 방법에 대한 설명이 잘 나와있는 페이지가 있다.


https://ctf.open.collab.net/sf/go/wiki2018



요약하자면,


1. SVN의 SSL 인증서를 교체하려면


{설치 폴더}\data\conf\server.crt

{설치 폴더}\data\conf\server.key


이 두 파일을 바꾸면 된다는 얘기다.

2. 또, Subversion Edge Console(관리자 페이지) 역시 HTTPS로 접속하도록 할 수 있는데

이 때 사용되는 SSL 인증서를 바꾸려면 Jetty Application Server에 매핑되어 있는 인증서를 바꾸어야 하는데

그걸 위해서는 Java의 keystore를 변경하고 설정파일에서 해당 keystore로 바꾸어 주면 된다는 얘기다.


그런데, 이 때는 키 파일이 따로 없는 PKCS12 방식의 인증서를 이용해야 하기 때문에 암호를 따로 입력해야 하고

이 때 암호를 평문이 아닌 난독화된(OBF: obfuscated) 문자열로 입력하려면

Jetty 라이브러리에 있는 함수를 이용해서 작업을 해주어야 한다는 얘기까지가 위 URL에 있는 내용이다.



이 요약 내용을 순서대로 정리해 보면 다음과 같다.


(1) 웹 서버(IIS)에서 서버 인증서 요청 생성: svn_cert.req

  - PEM 형식의 인증서 요청 파일이 만들어진다.


(2) 인증기관을 통해 인증서 발급: svn_cert.cer

  - 사내 Active Directory CA에서 발급하는 것을 기준으로 설명한다.

  - 인증기관에서 발급한 인증서는 CER 또는 DER 형식의 파일인데 아직 개인 키가 없는 상태.


(3) 웹 서버(IIS)에서 인증서 요청 완료 및 인증서 내보내기: svn_cert.pfx

  - 개인 키가 포함된 완벽한 상태의 인증서 파일

  - PFX는 PKCS12 형식의 인증서이므로 나중에 생성하는 .p12 파일 대신 이걸 써도 무방하다.

    (다만 플랫폼의 차이로 인해 Java keystore에서는 인식되지 않을 수도 있다)


(4) OPENSSL을 이용하여 PFX를 .crt와 .key 파일 두 개로 분리한다.

openssl pkcs12 -in svn_cert.pfx -nocerts -out svn_cert.key

openssl pkcs12 -in svn_cert.pfx -clcerts -nokeys -out svn_cert.crt

  - .key 파일은 암호화된 key 파일이므로 풀어주는 과정이 한번 더 필요하다.

openssl rsa -in svn_cert.key -outform PEM -out svn_cert-pem.key

  - 생성된 .crt 파일은 앞에 "Bag Attributes...." 등등 헤더가 붙은 PEM 형식의 파일인데 그대로 쓸 수는 없다.

  - 헤더 정보를 싹 지우고 "-----BEGIN CERTIFICATE-----" 부터 시작하도록 하여 저장해야 한다.


(5) 이렇게 만들어진 PEM 형식의 파일들을 server.crt 및 server.key 파일로 이름을 바꿔서

    {설치 폴더}\data\conf 폴더에 덮어쓴다.

  - 즉, C:\csvn에 설치했으면


C:\csvn\data\conf\server.crt
C:\csvn\data\conf\server.key
     이 경로의 파일들을 바꾸란 얘기다. (혹시 모르니 기존 파일은 백업해 둔다.)

  - 여기까지가 SVN서버 SSL 인증서 교체 끝.

  - CollabNet Subversion Server 서비스를 재시작해 주면 바뀐 인증서가 적용된다.


(6) Java의 keystore 파일로 저장하기 위해 인증서를 다시 PKCS12 형식으로 변환한다.

(원론적으로는 원래의 PFX 파일을 그냥 써도 된다... 아마도. 직접 해보진 않았다.)


openssl pkcs12 -export -in server.crt -inkey server.key -name svn_cert -out server.p12


(7) 다음으로 Java의 keytool을 이용해 keystore 파일로 저장한다.

  - Java keytool은 C:\Program Files\Java\jre6\bin에 설치되어 있다.


keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore svn_cert.jks


(8) 생성된 svn_cert.jsk 파일을 {설치 폴더}\appserver\etc 폴더에 복사한다.


(9) 해당 폴더에 있는 svnedge-ssl.xml 파일을 워드패드 등으로 열어서 수정한다.

  - 원래 있던 "/etc/svnedge.jks"를 "/etc/svn_cert.jks"로 바꾼다.

  - 암호는 평문으로 그냥 쓰거나, 아니면 아래 (10) 항목에서 생성된 문자열로 입력해 준다.


(10) 암호 난독화 문자열 얻기

  - 아래 명령을 {설치 폴더}\appserver 에서 실행한다.

  - Java 경로가 PATH에 잡혀 있지 않으면 C:\Program Files\Java\jre6\bin 전체 경로를 다 써준다.


java -cp lib\jetty-util-8.1.9.v20130131.jar org.eclipse.jetty.util.security.Password password!


  - 이렇게 실행한 결과 중 "OFB:"로 시작하는 문자열을 복사해서 위 (9) 항목의 암호란 3개를 모두 바꿔준다.



끝.





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]