Systems/Unix / Linux2012.05.24 17:23

SSL handshake failed: SSL error: Key usage violation in certificate has been detected


프로젝트 관리를 위한 서버에 VisualSVN 최신버전을 설치하고 Centos에서 svn co (checkout)을 돌렸더니 이런 오류가 발생한다. 자격증명서(certificate)에서 Key 사용에 관한 오류가 발생하여서 SSL 핸드셰이크(handshake)를 할 수 없다는 것. 


인터넷을 뒤져 이 문제가 libneon과 GnuTLS 등등에 있다는 것 까지는 알아냈는데, Centos에는 관련된 라이브러리가 설치되어 있지 않은 것처럼 보이는데도 문제가 생겨서 해결이 난감.


그래서 또다른 우회책을 찾았으니...


일단 VisualSVN 서버가 깔린 기계에서 regedit을 돌린다. 그리고 다음의 필드 추가.




즉, CreateGnuTLSCompatibleCertificate를 DWORD 타입으로 추가해서, 그 값을 1로 설정하는 것.


이렇게 한 다음에 이제 VisualSVN 서버에서 개인 자격 증명을 추가하면 되는데... 절차는 이렇다. 우선 VisualSVN 서버 관리자 화면의 왼쪽 Pane에서 최상위 노드를 클릭한 다음, 마우스 오른쪽 버튼을 누르고 Properties를 선택한다. 




그런 다음에 뜨는 창에서 Certificate를 선택하고, Change certificate를 누른다. 그리고 개인 자격 증명을 생성한다. 




이렇게 하고 Centos 쪽에서 Checkout을 실행해 보면, 다음과 같은 화면이 뜬다. 



지운 부분은 보시면 안되는 부분이니까 궁금해하지 마시고.. (수줍) 


아무튼 P를 선택하고 영구 승인을 한 다음에, 그냥 쓰면 된다. 개인 인증서라는게 껄쩍지근한 분들은 다른 해결책을 인터넷에서 찾아보시기 바라고.. ㅋㅋ


64비트 윈도우즈에서는 Registry 편집을 좀 달리해 주어야 할 수 있는데, 거기에 관해서는 아래의 링크를 참고하시기 바란다. 


http://www.visualsvn.com/support/topic/00056/



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 잘보고갑니다^^ 몰랐던 정보네요~

    2012.05.25 21:56 신고 [ ADDR : EDIT/ DEL : REPLY ]

Languages/Java2008.11.12 15:57

대략적인 작업 순서는 다음과 같다. (이 글은 "까먹기 전에 적어둔다"는 원칙을 지키기 위해 적은 것임을 미리 밝힌다. 그러므로 설명이 좀 덜 자세할 수도 있다. 필요하면 요청하시길...)

SVN 설치

sudo apt-get install subversion

SVN 저장소 생성

편한 곳으로 가서 svnadmin create repository 라고 치면, 그 디렉터리 아래에 repository라는 이름의 Subversion 저장소가 생성된다. 여기에 프로젝트 소스 코드를 등록하면 공유된다. 이 디렉터리 아래에 가면 conf 디렉터리가 있는데, 이 디렉터리에 있는 파일들을 수정하면 접속 가능한 사용자와 그 사용자의 패스워드를 설정할 수가 있다. 다음의 파일을 참고하자.

1. authz파일

### This file is an example authorization file for svnserve.
### Its format is identical to that of mod_authz_svn authorization
### files.
### As shown below each section defines authorizations for the path and
### (optional) repository specified by the section name.
### The authorizations follow. An authorization line can refer to a
### single user, to a group of users defined in a special [groups]
### section, or to anyone using the '*' wildcard.  Each definition can
### grant read ('r') access, read-write ('rw') access, or no access
### ('').

[groups]
developers=bjlee,ngen

[repository:/]
@developers = rw
* = r

[/]
@developers = rw
* = r

# [/foo/bar]
# harry = rw
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r

2. passwd 파일

### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
bjlee=xxx
ngen=yyy

# harry = harryssecret
# sally = sallyssecret

3. svnserve.conf 파일

### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)

### Visit http://subversion.tigris.org/ for more information.

[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = read
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the conf directory.
### Uncomment the line below to use the default password file.
password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the conf
### directory.  If you don't specify an authz-db, no path-based access
### control is done.
### Uncomment the line below to use the default authorization file.
authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
# realm = My First Repository

SVN Server 실행

svnserve라는 프로그램을 실행하면 SVN 서버를 외부에서 svn://으로 시작하는 URL로 참조하여 사용할 수가 있다. 아까 생성한 repository 디렉터리로 가서, svnserve -d -r . 이라고 해 주자. -d는 daemon으로 띄우라는 소리이고, -r . 은 바로 여이가 repository 디렉터리란 뜻이다.

Maven2 설치

설치법은 인터넷에 다른 좋은 문서들이 많이 있으니 알아서 찾아보시길. ^^;

Maven2 프로젝트 생성

Maven 프로젝트는 다음과 같이 생성한다.

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app

artifact id는 내 프로젝트의 ID라고 생각하면 된다. 위와 같이 실행하면 다음과 같은 디스크 레이아웃이 만들어지게 된다.

my-app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java
이제 여기에 소스 코드를 추가해 나가기만 하면 된다. 프로젝트가 여러 가지 다른 jar 파일에 의존하고 있다면, 그 파일에 대한 의존성도 역시 추가해 나가기만 하면 된다. Maven이 좋은 점은, 내 프로젝트가 의존하는 jar 파일을 어떻게 다운 받아서 어떻게 설치할 것인지를 고민하지 않아도, 대부분 알아서 다 해준다는 점이다. 의존성은 pom.xml 파일에 추가한다.

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.5</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>maven-plugins</groupId>
      <artifactId>maven-findbugs-plugin</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>jalopy</groupId>
      <artifactId>jalopy</artifactId>
      <version>1.5rc3</version>
    </dependency>
    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.3</version>
    </dependency>
    <dependency>
      <groupId>org.jmock</groupId>
      <artifactId>jmock-junit4</artifactId>
      <version>2.5.1</version>
    </dependency>
    <dependency>
      <groupId>org.jmock</groupId>
      <artifactId>jmock-legacy</artifactId>
      <version>2.5.1</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.15</version>
    </dependency>
    <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>xpp3</groupId>
      <artifactId>xpp3_min</artifactId>
      <version>1.1.4c</version>
    </dependency>
  </dependencies>

필자의 프로젝트는 저렇게 많은 3rd-party 프로젝트들에 의존하고 있다. 의존 대상이 되는 라이브러리의 group id와 artifact id를 적어주고, 버전 정보만 정확하게 적어주면 이 파일들을 어떻게 다운받아 어떻게 설치할 것인지는 Maven이 다 알아해 준다. 그런데 group id와 artifact id 등의 정보는 어떻게 알아내느냐고? www.mvnrepository.com 에 가서 프로젝트 이름으로 검색을 해 보면, 여러분의 POM 파일에 끼워넣어야 할 dependency 태그 코드를 버전 별로 다 알려준다.

그런데 한가지 귀찮은 것은, sun에서 배포하는 jar 파일 중에는 자동 설치가 되지 않는 놈이 있다는 사실이다. 그런 것이 발견될 경우, Maven은 친절하게 "그런 파일은 어떻게 어떻게 처리해 주십사"는 안내 메시지까지 보여준다.[각주:1]

코드를 적절히 작성했다면 컴파일 해 보고 싶을 것이다. mvn compile 하면 컴파일 되고, mvn test 하면 jUnit 테스트 코드가 실행된다.

SVN 서버에 프로젝트 코드 올리기

SVN 서버에 프로젝트 코드를 올리는 것은 간단하다.

svn import <ProjectName> svn://<서버주소>/<프로젝트 이름>

위와 같이 하면 된다. 프로젝트 이름을 URL 위에 꼭 붙여주는 것이 좋은데, 아까 만들었던 repository가 범용 리파지토리, 그러니까 여러가지 프로젝트가 동시에 등록될 수 있는 리파지토리이기 때문이다. 이 이름을 주지 않으면 나중에 프로젝트를 Eclipse를 통해 직접 체크아웃한 다음 빌드하려고 할 때 애로사항이 꽃피게 될 수도 있다. 그러니 반드시 주자. 아이디와 패스워드를 묻거든, authz파일과 passwd 파일에 설정한 대로 입력하자. 그러면 성공적으로 등록될 것이다.

SVN 서버에 올린 프로젝트 다운 받아 빌드하기

Eclipse에서 다운받아 빌드하는 것에는 대략 두 가지 방법이 있다. TortoiseSVN같은 툴을 써서 임의의 디렉터리에 프로젝트 코드를 통째로 checkout한 다음 eclipse 프로젝트로 임포트 해서 빌드하는 방법이 있고, Eclipse 안에서 SVN 연동기능을 사용해 직접 checkout 받아 빌드하는 방법이 있다.

첫 번째 방법을 쓰던 두 번째 방법을 쓰던 방법 자체가 너무 뻔해서 따로 설명하진 않겠다. 다만 Eclips에 Maven 2 플러그인을 설치해야 한다는 것에만 주의하자.

SVN 서버에 올린 프로젝트를 Hudson으로 빌드하기

이게 SVN 서버에 올라간 프로젝트를 Hudson을 통해 CI 할 수 있다. Hudson 설치는 너무 간단한 관계로 따로 설명하지 않겠지만 한가지만 언급하자면, 굳이 Hudson을 다른 웹 서버에 붙여 돌리려고 애쓰지 말기 바란다. 그래봐야 별 차이가 없는데다, standalone으로 돌리는 편이 훨씬 간단하다.

java -jar hudson.war 만 하면 hudson 서버가 실행되기 때문.

이렇게 실행시키고, 실행시킨 서버의 URL의 8080 포트번호로 웹 브라우저를 통해 접속해보면, 허드슨 main 페이지를 보게 된다. 여기에 새로운 죠브를 등록한다.

새로운 죠브를 등록할 때 SVN Repository의 URL을 입력하게 되는데, 여기에는 아까 SVN 서버에 프로젝트 코드를 올릴때 썼던 URL을 주면 된다. svn://<서버주소>/<프로젝트 이름> 이렇게 주면 된다는 것. 그러면 Hudson은 해당 이름의 프로젝트로 등록된 코드들을 쭉 받아서 빌드하게 될 것이다.

한가지 유의할 것은, compile 이외의 maven goal들을 실행하고자 하는 경우에는 Build 섹션의 goals and options 부분에 여러 가지 goal 들을 나열해주어야 한다는 것. 필자는 compile test findbugs:findbugs 를 적어주었다. compile은 컴파일하기 위한 것이고, test는 테스트를 수행하기 위한 것이고, findbugs:findbugs는 findbugs 리포트를 생성하기 위한 것이다. findbugs는 Maven 플러그인 중 한가지로, 이 플러그인을 사용하면 코드에 존재하는 잠재적인 버그를 검사할 수 있다. Maven 프로젝트를 정의할 때 pom.xml에 다음과 같이 적어주면 작동하도록 할 수 있다.

<project>
  [...]
  <reporting>
    <plugins>
      <plugin>
        <groupId>maven-plugins</groupId>
        <artifactId>maven-findbugs-plugin</artifactId>
        <version>1.4</version>
        <configuration>
          <findbugsXmlOutput>true</findbugsXmlOutput>
          <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
          <xmlOutput>true</xmlOutput>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</project>

이렇게 한 다음에 Hudson의 project configuratiojn 부분에서는 Build Setting 섹션에 가서 Publish Findbugs Analysis Result를 세팅한다. 이렇게 하고 나면 빌드가 끝난 후에 그 결과가 성공이었는지 실패였는지의 여부 이외에도 다양한 정보와 버그 추이를 쉽게 확인할 수 있을 것이다. Publish Findbugs Analysis Result 항목이 보이지 않는 경우에는 Hudson에 findbugs 플러그인이 설치되어 있지 않은 것이므로, 설치해 주어야 한다. (정리해보자면, findbugs를 돌리기 위해서는 Maven 프로젝트에 설정을 해 주어야 하고, Hudson에도 플러그인을 설치해 주어야 하고, 최종적으로 Hudson 프로젝트 설정을 수정해야 하는 셈.) 플러그인 설치는 Hudson 관리 메뉴쪽으로 들어가보면 할 수 있다.

[그림이 업로드가 안되어서 (무슨조환지) 참고할만한 그림은 못올렸습니다. 나중에 시간나면 업데이트..]
  1. Windows 환경에서 Eclipse 위에 Maven 2 플러그인을 돌리고 있는 사용자가 Maven 2 프로젝트를 임포트받아 컴파일하는 경우에는 그런 메시지를 받았을 경우 처리하기가 좀 난감한데, 다음과 같이 처리하면 된다. 우선, 자동 설치가 안되는 파일을 sun의 홈페이지에 가서 다운 받는다. (어디서 다운받아야 하는지는 Maven이 알려준다.) 다운 받은 파일을 C:Document and Settings&lt;자기 사용자 이름&gt;.m2repository 디렉터리의 적절한 위치에 옮긴다. 어느 위치로 옮겨야 하느냐는 역시 Maven이 보여주는 안내메시지를 보면 대략적으로 짐작할 수 있다. 옮긴 뒤에는, 해당 디렉터리 안에 있는 pom 파일명에 포함된 버전 번호와 같은 버전 번호를 갖도록 파일 이름을 적절히 바꾸어 주어야 한다. [본문으로]
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 좋은 조합이네요.

    2008.11.12 16:16 신고 [ ADDR : EDIT/ DEL : REPLY ]

Languages/Java2008.07.16 12:44

SVN 서버 준비 (with apache2)

sudo apt-get install libapache2-svn
위의 절차는 /usr/lib/apache2/modules/ 디렉터리에 mod_svn_dav.so(?) 파일을 깔기 위한 것.

그 다음에 /etc/apache2/conf.d/svn 파일 생성 후 다음과 같이 입력. 붉은 색으로 표시된 부분은 각자 입맛에 따라 바꾸면 됨.

<Location /svn/pe>
    DAV svn
    SVNPath /home/bjlee/work/svn/pe
        AuthType Basic
        AuthName "PE svn repository"
        AuthUserFile /home/bjlee/work/trac/pe/trac.htpasswd
        Require valid-user
</Location>

필자는 Trac 패스워드를 재사용하였다. 'developer'같은 멍청한 이름의 사용자를 두지 않는 한 괜찮을 듯. 어차피 Trac 시스템을 사용하는 사람들이 Eclipse를 써서 소스를 고치고 등록할테니.

그런 다음 /home/bjlee/work/svn/pe 디렉터리의 권한을 다음과 같이 수정.

addgroup bjlee www-data
sudo chown -R bjlee:www-data pe
sudo chmod -R g+w pe/
sudo chmod 444 pe/format pe/db/format

여기까지 한 다음 sudo apache2ctl restart 한다.
간혹 /etc/apache2/conf.d/svn 파일에 문제가 있다는 오류 메시지가 뜨기도 할텐데, 대부분 LoadModule를 추가하지 않아서 생기는 문제일 것. http://www.pyrasis.com/main/Subversion-HOWTO#s-4.2 이 문서를 참고해서 /etc/apache2/conf.d/svn 맨 윗줄에 추가해주면 된다. 필자는 안넣어도 되길래 그냥 넣지 않았다.

Subversion, m2clipse 플러그인 설치 (+with Eclipse)

Subversion plugin을 Eclipse에 설치하면 SVN 서버와 연동할 수 있다. 물론 SVN 서버는 상기 절차를 거쳐 apache2 서버를 통해 외부와 연동할 준비가 되어 있어야 한다.

ubversion 설치를 위해서는 update 사이트에 http://subclipse.tigris.org/update_1.4.x 를 추가. 그런 다음 m2clipse plugin 설치를 위한  http://m2eclipse.sonatype.org/update/ 사이트를 역시 update 사이트에 추가.

그런데 설치하려고 하다보면 equinox라는 플러그인에 대한 의존성을 해결할 수 없다고 불평할 때가 있음. 그런 경우에는 관련 플러그인들을 찾아서 설치하거나 Maven Integration for AJDT를 선택하지 않으면 문제를 해결할 수 있음.

Eclise에서 Maven 프로젝트를 생성하고 SVN 저장소에 등록해보자

프로젝트 생성 과정은 다음과 같다.
File->New->Maven Project
첫 번째 창에서 use default workspace location을 선택하고, 
두 번째 창에서 maven-archetype-quickstart를 선택한다. (Nexus Indexer가 선택된 상태라야 가능)
세 번째 창에서 필요한 값들을 입력하고 finish를 누르면 프로젝트가 생성된다.

프로젝트를 SVN 서버에 올리는 과정은 다음과 같다.
프로젝트 생성 후 프로젝트 이름 위에서 마우스 오른쪽 버튼 클릭 -> team -> share 선택하면
첫 번째 창에서 SVN 선택,
두 번째 창에서 리파지토리 위치 선택 (http://xxxx.../svn/pe)
그러고 나면 아이디랑 패스워드를 물어볼텐데, 그때는 적절히 아이디랑 패스워드를 입력해 주면 됨. (그에 대해서는 맨 위의 "SVN 서버 준비"의 관련 부분 참고.

맺으며

여기까지 하면 Eclipse를 통해 Maven 프로젝트를 생성하고, 중앙 저장소에 등록하는 준비가 끝난 셈이다. 이전 글에서 설명했던 MyLyn + Trac 연동만 제대로 되면, "이슈 추적 + 코드 공유"라는 큰 그림을 Eclipse를 통해 그리는 준비작업은 대략 끝난 셈이다.

이제 필요한 것은 SVN 저장소에 저장된 공유 코드들을 매일 빌드하고, 그 결과를 새로운 이슈로 만들어 Trac에 등록하는 작업을 어떻게 처리하느냐다.

그 부분은 다음 글에서 다루도록 하겠다.

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^