카우치베이스 모바일 2.0 는 모든 Couchbase 모바일 플랫폼에서 인증서 고정을 지원합니다. 인증서 고정은 애플리케이션에서 호스트를 인증서/공개 키에 "고정"하는 데 사용하는 기술입니다. Couchbase Lite와 동기화 게이트웨이 간의 통신은 다음을 사용하여 암호화 및 보호됩니다. SSL/TLS. SSL/TLS 프로토콜은 공개 키 인프라(PKI) 메커니즘을 사용하여 X.509 인증서 를 사용하여 동기화 게이트웨이 서버의 ID를 설정합니다. 인증서는 일반적으로 신뢰할 수 있는 인증 기관에서 발급/서명하며 동기화 게이트웨이에 설치됩니다.
개발 환경에서는 이 인증서를 자체 서명할 수 있습니다.
인증서의 신뢰성이 어떻게든 손상되었거나 자체 서명된 인증서를 사용하는 경우 서버의 신원을 안정적으로 설정할 수 없으며 클라이언트와 서버 간의 통신에 대한 기밀성을 보장할 수 없습니다. 이러한 문제를 완화하기 위해 Couchbase Lite는 다음을 지원합니다. 인증서 고정. 인증서 고정을 수행하기 위해 일반적으로 공개 키 인증서는 대역 외 채널을 통해 클라이언트 앱v에 전달되고 클라이언트 앱과 함께 번들로 제공됩니다. 인증서를 고정하면 확인 클라이언트 앱은 더 이상 서명을 확인하기 위해 타사 CA에 의존할 필요가 없습니다. 이 기술은 자체 서명 인증서로 구성된 동기화 게이트웨이와 통신하는 데도 필요합니다.
이 게시물에서는 Coucbase Lite 내에서 인증서를 고정하는 방법에 대해 설명합니다. 버전 2.0 활성화된 Android 앱입니다. 버전 1.4 의 경우 iOS에서만 인증서 고정을 지원하며, 이는 이 문서에서 설명한 블로그 게시물.
다음에서 Couchbase Mobile 2.0의 최신 사전 릴리스 빌드를 다운로드할 수 있습니다. 여기.
배경
SSL/TLS에 익숙하거나 이 글을 읽은 적이 있는 경우 블로그 게시물이 블로그 게시물의 "Couchbase Mobile로 인증서 고정 지원" 섹션으로 건너뛸 수 있습니다.
카우치베이스 라이트와 동기화 게이트웨이 간의 통신은 다음을 사용하여 암호화됩니다. SSL/TLS매우 높은 수준에서 TLS 프로토콜은 다음과 같이 작동합니다.
공개 키와 서버 ID가 포함된 X.509 인증서가 동기화 게이트웨이에 설치됩니다. 이 공개 키 인증서는 신뢰할 수 있는 타사 인증 기관에서 서명하거나 자체 서명할 수 있으며, 일반적으로 개발 환경에서는 후자의 경우가 많습니다.
연결이 설정되는 동안 Couchbase Lite를 실행하는 클라이언트 앱은 서버 인증서를 사용하여 동기화 게이트웨이의 신원을 확인합니다. Couchbase Lite는 신뢰할 수 있는 CA의 루트 인증서를 사용하여 인증서의 유효성을 검사합니다. 확인이 완료되면 클라이언트는 비밀 키 교환을 진행합니다. 그런 다음 공유된 비밀은 클라이언트와 동기화 게이트웨이 간의 통신을 암호화하는 데 사용됩니다.
참고하세요. RFC 에서 SSL/TLS 프로토콜에 대한 자세한 내용을 확인하세요.
이 접근 방식에는 몇 가지 문제가 있습니다.
- 대부분의 상황에서는 CA의 신뢰성에 의존하는 것이 합리적이지만, CA 자체가 손상될 수 있습니다. 이 경우 인증에 사용되는 CA 자체가 신뢰할 수 없기 때문에 동기화 게이트웨이를 인증할 수 있는 신뢰할 수 있는 방법이 없습니다!
- 클라이언트-서버 통신은 동기화 게이트웨이로 가장한 악성 서버가 가짜 CA가 서명한 동기화 게이트웨이를 나타내는 가짜 인증서를 발급하는 중간자(MiTM) 공격의 대상이 될 수 있습니다. 클라이언트가 신뢰할 수 있는 루트 인증 기관 저장소에 가짜 CA의 인증서를 포함하도록 잘못 유도하면 클라이언트는 가짜 CA가 서명한 가짜 인증서를 신뢰하게 됩니다. 이렇게 되면 클라이언트는 이제 가짜 동기화 게이트웨이와 통신하게 됩니다.
- 개발 환경에서 자체 서명된 인증서를 사용하는 경우 클라이언트가 서버의 신원을 안정적으로 검증할 수 있는 방법이 없습니다.
인증서 고정
위에 나열된 문제를 처리하는 일반적인 방법 중 하나는 동기화 게이트웨이 서버를 인증서/공개 키에 "고정"하는 것입니다. 이 기술에서 Couchbase Lite는 신뢰할 수 있는 동기화 게이트웨이 인증서로 사전 구성됩니다. 따라서 연결이 설정되는 동안 Couchbase Lite는 이 사전 구성된 인증서를 사용하여 서버의 신원을 확인합니다. 따라서 인증서 확인을 위해 외부 타사 CA에 의존하지 않아도 됩니다.
그리고 OWASP 웹사이트 인증서 고정에 대한 좋은 참고 자료입니다.
주의
애플리케이션이 인증서와 함께 번들로 제공되므로 인증서가 만료될 때마다 애플리케이션을 새 인증서로 업데이트해야 한다는 점에 유의해야 합니다. 이는 사용자가 앱을 업그레이드해야 하는 모바일 환경에서는 조금 더 어려울 수 있습니다. 따라서 인증서가 만료되는 시기를 파악하고 인증서 만료 전에 새 인증서로 애플리케이션을 게시할 수 있도록 적절한 계획을 세우세요.
카우치베이스 모바일로 인증서 고정 지원
이 게시물은 Android 앱 개발 및 Couchbase Lite 2.0을 사용하도록 앱을 구성하는 데 익숙하다고 가정합니다. 그렇지 않은 경우 다음을 검토하시기 바랍니다. 시작하기 가이드. 우리는 사용할 것입니다 동기화 게이트웨이 1.5 클라우드에서 카우치베이스 서버 클라우드에서 데이터를 유지합니다. 카우치베이스 서버는 이 글의 논의와 관련이 없습니다.
동기화 게이트웨이에 인증서 설치
의 지침을 따르세요. 카우치베이스 개발자 포털 를 클릭하여 동기화 게이트웨이에 관련 서버 인증서를 생성/설치합니다.
인증서 생성 시 주의해야 할 몇 가지 사항: - 다음과 같습니다.
- 인증서 및 해당 개인 키는 .pem 형식이어야 합니다.
- 동기화 게이트웨이에 액세스할 수 있는 위치에 인증서를 설치합니다. 그렇게 하지 않으면 구성 파일로 동기화 게이트웨이를 시작할 때 오류가 발생합니다.
1 2 3 4 5 |
2017-12-10T16:05:21.303-05:00 사용 메타데이터 퍼지 간격 의 3.00 일수 에 대한 묘비 압축. 2017-12-10T16:05:21.305-05:00 시작 관리자 서버 on 127.0.0.1:4985 2017-12-10T16:05:21.310-05:00 시작 서버 on :4984 ... 2017-12-10T16:05:21.310-05:00 HTTP: 프로토콜 활성화: [http/1.1] on 127.0.0.1:4985 2017-12-10T16:05:21.311-05:00 FATAL: 실패 에 시작 HTTP 서버 on 127.0.0.1:4985: 열기 cert.pem: 아니요 그런 파일 또는 디렉토리 - rest.(*서버 구성).Serve() 에서 구성.go:716 |
- 생성하는 경우 자체 서명 인증서가장 중요한 분야는 아마도
공통 이름
. 동기화 게이트웨이의 FQDN이어야 합니다. 동기화 게이트웨이가 없는 경우에는 사용 용도10.0.2.2
를 로컬 호스트 또는 동기화 게이트웨이의 고정 IP주소로 설정합니다.
동기화 게이트웨이 구성 파일
동기화 게이트웨이 구성 파일에 다음 속성이 포함되어 있는지 확인합니다.
1 2 |
"SSLCert": "ssl/cert.pem", "SSLKey": "ssl/privkey.pem", |
동기화 게이트웨이에서 SSL 설정 확인하기
SSL을 통해 동기화 게이트웨이에 연결할 수 있는지 확인하려면 다음을 실행합니다. curl
명령을 터미널 명령에 추가합니다. 바꾸다 localhost 를 동기화 게이트웨이의 IP 주소와 함께 아래 명령어로 입력합니다.
1 |
curl -k -X GET https://localhost:4984 -H '캐시 제어: 캐시 없음' -verbose |
구성이 올바른 경우 출력에 다음과 같은 내용이 표시되어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
* 재구축 URL 에: https://localhost:4984 / * 시도 중 ::1... * TCP_NODELAY set * 연결됨 에 localhost (::1) 포트 4984 (#0) * ALPN, 오퍼링 http/1.1 * Cipher 선택: ALL:!내보내기:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@힘 * 성공 set 인증서 확인 위치: * CAfile: /사용자/priya.rajagopal/아나콘다/ssl/cacert.pem CApath: 없음 * TLSv1.2 (OUT), TLS 헤더, 인증서 상태 (22): * TLSv1.2 (OUT), TLS 핸드셰이크, 클라이언트 hello (1): * TLSv1.2 (IN), TLS 핸드셰이크, 서버 hello (2): * TLSv1.2 (IN), TLS 핸드셰이크, 인증서 (11): * TLSv1.2 (IN), TLS 핸드셰이크, 서버 키 교환 (12): * TLSv1.2 (IN), TLS 핸드셰이크, 서버 완료 (14): * TLSv1.2 (OUT), TLS 핸드셰이크, 클라이언트 키 교환 (16): * TLSv1.2 (OUT), TLS 변경 암호, 클라이언트 hello (1): * TLSv1.2 (OUT), TLS 핸드셰이크, 완료 (20): * TLSv1.2 (IN), TLS 변경 암호, 클라이언트 hello (1): * TLSv1.2 (IN), TLS 핸드셰이크, 완료 (20): * SSL 연결 사용 TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 * ALPN, 서버 수락됨 에 사용 http/1.1 * 서버 인증서: * subject: C=US; ST=미시간; O=카우치베이스; CN=localhost * 시작 날짜: 12월 8 14:00:33 2017 GMT * 만료 날짜: 12월 7 14:00:33 2020 GMT * 발행자: C=US; ST=미시간; O=카우치베이스; CN=localhost * SSL 인증서 확인 결과: self 서명 인증서 (18), 계속 어쨌든. > GET / HTTP/1.1 > 호스트: localhost:4984 > 사용자-에이전트: curl/7.52.1 > 수락: / > 캐시-제어: 아니요-캐시 > < HTTP/1.1 200 확인 < 콘텐츠-길이: 130 < 콘텐츠-유형: 애플리케이션/json < 서버: 카우치베이스 동기화 게이트웨이/1.5.1 < 날짜: 금, 08 12월 2017 14:27:07 GMT < * Curl_http_done: 호출 조기 == 0 * 연결 로컬호스트를 호스트하는 #0은 그대로 유지됨 {"couchdb":"환영","vendor":{"name":"카우치베이스 동기화 게이트웨이","버전":1.5},"버전":"카우치베이스 동기화 게이트웨이/1.5.1(4;cb9522c)"} |
- 아래 명령을 사용하여 PEM 인증서를 der 형식으로 변환합니다.
1 |
openssl x509 -알리기 PEM -in cert.pem -아웃폼 DER -out cert.cer |
다음을 참조할 수 있습니다. SSL 치트 시트 에서 다양한 openSSL 명령에 대한 자세한 내용을 확인하세요.
- 복사
cert.pem
파일을 자산 폴더로 이동합니다. Android Studio 프로젝트 폴더는 다음과 비슷해야 합니다.
- 동기화 게이트웨이 서버 인증서 고정
- 인증서를 고정하려면 먼저 번들로 제공되는 인증서를 로드해야 합니다. 자산 폴더로 이동합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
비공개 바이트[] 고정된 인증서 파일(컨텍스트 컨텍스트) { 자산 관리자 자산 관리자 = 컨텍스트.getAssets(); 입력 스트림 는 = null; 바이트[] 바이트 = new 바이트[0]; 시도 { 는 = 자산 관리자.열기("cert.cer"); 반환 (IOUtils.toByteArray(는)); } catch (IOException e) { e.프린트스택트레이스(); } 반환 null; } |
이 예제에서는 [Apache Commons IO](https://commons.apache.org/proper/commons-io/description.html)의 IOUtils 유틸리티 클래스를 사용하여 파일 입력 스트림에서 읽은 인증서를 다음과 같이 변환합니다. 바이트
배열로 변환합니다. 변환을 위해 다른 도구/방법을 선택할 수 있습니다.
- 구성 리플리케이터
를 사용하여 고정된 인증서를 사용합니다. 실제 앱에서는 설정하기 전에 인증서에서 Null 확인을 합니다. 간결함을 위해 여기서는 확인을 생략합니다.
1 2 3 4 5 6 7 8 9 10 |
리플리케이터 구성 구성 = new 리플리케이터 구성(데이터베이스, new URL엔드포인트(URL)); 구성.setReplicatorType(리플리케이터 구성.리플리케이터 유형.PUSH_AND_PULL); 구성.setContinuous(true); 구성.setAuthenticator(new 기본 인증자(사용자 이름, 비밀번호)); // 앱에 번들로 제공되는 인증서 받기 바이트[] 고정된 서버 인증서 = 이.고정된 인증서 파일(컨텍스트); // 고정된 인증서를 설정합니다. 구성.고정 서버 인증서 설정(고정된 서버 인증서); 리플리케이터 리플리케이터 = new 리플리케이터(구성); |
이제 끝났습니다! 몇 단계만 거치면 카우치베이스 모바일 2.0으로 안드로이드 앱에서 인증서 고정을 활성화할 수 있습니다.
다음 단계
이 블로그 게시물에서는 모바일 앱 내에서 인증서 고정의 이점과 Couchbase Lite 2.0에서 인증서 고정을 사용하도록 설정하는 방법에 대해 설명했습니다. 이 예에서는 Android 앱에 대해 설명했지만 다른 플랫폼에서도 접근 방식은 비슷할 것입니다.
질문이나 피드백이 있으면 아래에 댓글을 남기거나 트위터로 언제든지 문의해 주세요. @rajagp 또는 이메일을 보내주세요. priya.rajagopal@couchbase.com. . 카우치베이스 포럼 를 통해 질문할 수 있습니다.