일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 인증
- Xcode
- apple
- Nodejs
- git
- 앱스토어
- OTP
- fido
- OSX
- 2FA
- SSH
- MYSQL
- SSL
- openssl
- 애플
- FIDO2
- 앨범북
- albumbook
- appres
- SWIFT
- kmip
- SwiftUI
- otpkey
- Android
- MFA
- WebAuthn
- css
- 앱리소스
- MSYS2
- 안드로이드
- Today
- Total
인디노트
OpenSSL API를 이용한 보안 프로그래밍, Part 3: 보안 서비스 제공하기 (한글) 본문
|
난이도 : 중급 Kenneth Ballard, Software Engineer, MediNotes Corp. 2007 년 10 월 02 일 보안 서버 애플리케이션이 없이는, 보안 클라이언트 애플리케이션도 존재하지 않습니다. OpenSSL을 사용하여 보안 서버 애플리케이션들을 생성할 수 있고, 문서화가 완전하지 않아도 어렵지는 않습니다. 본 3개 시리즈의 Part 1에서 설명한 개념을 기반으로 보안 서버 애플리케이션을 구현하는 방법을 배워봅시다. 본 시리즈의 두 Part에서는 OpenSSL을 이용한 클라이언트 측 애플리케이션 구현에 대해 설명했다. Part 1에서는 OpenSSL을 사용한 기본 보안 클라이언트를 구현하는 방법을 설명했고, Part 2에서는 디지털 인증서에 대해 자세히 설명했다. 본 기술자료에 대해 이메일과 긍정적인 피드백을 받고 나서, 다음에는 어떤 논의를 이어가야 할지 명확해 졌다.
서버는 네트워크와 인터넷에 파일과 장치와 같은 리소스로의 액세스를 제공한다. 가끔씩, 이러한 서비스들을 보안 채널을 통해서 제공해야 할 때도 있다. OpenSSL을 사용하여 보안 및 오픈 채널을 사용하여 서비스를 만들 수 있다. OpenSSL을 이용하여 기본적인 서버 애플리케이션을 생성하는 것은 기본적인 클라이언트 애플리케이션을 구현하는 것과 본질적으로 거의 같다. 차이점은 비교적 적다. 분명한 것은 서버는 아웃고잉 연결을 생성하는 대신 인커밍 연결을 수락하도록 설정되어야 한다는 점이다. 본 시리즈 Part 2의 디지털 인증서에 대한 글을 기억해 보면 알겠지만, 서버는 핸드쉐이크 동안 사용되는 보안 인증서도 제공해야 한다. 서버들은 인커밍 연결을 그저 기다리는 것이 전부이다. 결국, 이것은 서버가 존재하는 이유이다. 웹 서버들은 브라우저가 페이지를 요청하기를 기다리고, FTP 서버들은 클라이언트가 파일을 요청하기를 기다리며, 채팅 서버는 인커밍 채팅 클라이언트 연결을 기다린다. 서버는 그저 기다릴 뿐이다. 핸드쉐이크의 관점에서 서버가 동전의 다른 쪽에 있다는 것을 제외하고는 보안 클라이언트와 서버 통신간에는 거의 차이가 없다. 모든 것이 같다. 따라서, 여러분이 OpenSSL을 이용하여 클라이언트 애플리케이션을 작성하는 방법만 알고 있다면 OpenSSL을 사용하여 보안 서버 애플리케이션을 구현하는 것은 식은죽 먹기다. (그렇지 않다면, 본 시리즈 Part 1, "API의 개요"에서 OpenSSL 라이브러리 설정 방법을 배우기 바란다.)
또는 두 개의 식별 방법이라고도 할 수 있다. 서버는 핸드쉐이크 동안 사용될 보안 인증서를 제공할 책임이 있다. 완전한 서버 인증서는 두 부분, 공개 키(public key)와 개인 키(private key)로 구성된다. 공개 키는 클라이언트로 보내지는 것이고, 개인 키는 비밀로 유지된다. 트러스트 인증서가 클라이언트 애플리케이션용 라이브러리에 제공되어야 하는 것처럼, 서버 키들도 서버 애플리케이션용 라이브러리에 제공되어야 한다. 이를 제공하는 여러 함수들이 있다. Listing 1. 서버 인증서를 로딩하는 함수들
개인 키를 로딩하려면, 다음 함수들 중 하나를 사용한다. Listing 2. 개인 키 로딩을 위한 함수들
어떤 개인 키라도 암호화 되어 저장된다. 문제는, 인증서를 로딩하는 함수들이 암호화 된 인증서에 패스워드를 요청하지 않는다는 점이다. 대신, OpenSSL은 패스워드를 얻을 때 콜백 메커니즘을 제공한다. 콜백의 포맷은 다음과 같다. Listing 3. 콜백 포맷
이 글의 목적상, 마지막 매개변수,
매개변수 패스워드는 인증서가 로딩될 때 단 한번 요청되기 때문에, 해독되고 메모리에 저장될 수 있다. 사용자에게서 패스워드를 획득하는 방법은 구현에 전적으로 달려있다. 패스워드 콜백 함수를 생성했다면, 이것을 Listing 4. 콜백 함수 설치하기
콜백 함수가 생성되어 사용자에게 패스워드를 묻는 프롬프트가 생겼으니, 인증서를 실제로 가져오는 함수가 사용될 수 있다. 인증서는 기존 메모리 구조나 파일에서 가져올 수 있다. Apache HTTP Server Project의 디지털 인증서처럼, 디지털 인증서를 다루는 일반적인 방식에 더하여 인증서를 로딩하는 방법을 설명하겠다. 본 시리즈의 Part 1을 읽었다면, 인증서를 로딩하는 것은 트러스트 스토어가 이전 기술 자료의 데모에서 로딩된 방식과 비슷하다는 것을 알 수 있을 것이다. 클라이언트로 보내지는 것 중 하나인 공개 인증서로 시작하겠다. Listing 5. 공개 인증서 로딩하기
공개 인증서가 로딩된 후에, 개인 인증서도 로딩되어야 한다. 이 부분은 핸드쉐이크 동안 필요하다. 클라이언트는 공개 인증서로 암호화 된 정보를 서버로 보낼 것이기 때문이다. 이 데이터는 개인 키를 사용해서 해독될 수 있다. 일관성을 유지하기 위해, 파일에서 키를 로딩한다. Listing 6. 개인 키 로딩하기
콘텍스트(SSL 콘텍스트 사이드바 참조)를 설정하고 키를 로딩했다면, 이제는 BIO 객체를 생성하여 설정을 끝낼 차례이다. Part 1에서는 OpenSSL의 BIO 라이브러리를 사용하여 SSL과 비 SSL 통신 모두를 구축하는 방법을 설명했다. 일관성을 유지하기 위해, 같은 것이 이 곳에서도 수행된다. Listing 7. BIO 포인터
세 개의 BIO 객체들? 왜 세 개씩이나 필요한가? 다 이유가 있다. 나를 믿어라. (기억하는가? 신뢰와 보안은 함께 한다는 것을..) 우선, Listing 8. 메인 BIO 객체 설정하기
BIO 객체 설정은 클라이언트 연결을 설정하는 것과는 다르다. 클라이언트 연결이 여기에서, 설정은 두 개의 매개변수, SSL_CTX 객체에 대한 포인터와 플래그와 함께 Listing 9. accept BIO 설정하기
이것은 보안 연결을 리스닝 할 것이므로, 보안 BIO를 이 accept BIO로 연결시켜야 한다. 여기에서 두 번째 함수 호출, 이 함수는 SSL BIO를 해제할 필요도 없앤다. accept BIO가 제거되면 자동으로 해제된다.
서버는 어부와 같다. 클라이언트가 물릴 때까지 앉아서 기다린다. 서버는 그저 인커밍 연결을 기다릴 뿐이다. 여러분이 Winsock이나 BSD Sockets를 사용해본 경험이 있다면, Listing 10. 서버에게 앉을 것을(sit) 명령하기
Listing 11. 연결하기
accept BIO에서 인커밍 연결을 해제한 후에, 핸드쉐이크는 서버는 BIO 라이브러리에 사용할 수 있는 다양한 읽기 및 쓰기 함수들을 통해 클라이언트와 통신한다. 이 부분은 Part 1에서 설명했으므로 참조하기 바란다.
결국, OpenSSL로 보안 서버 애플리케이션들을 구현하는 것은 실행 방법을 이해하기만 한다면 어렵지 않다. 이 코드 샘플을 확장하여 완벽한 SSL 서버 애플리케이션들을 여러분의 필요에 맞게 구현할 수 있다. 다시 한번 말하지만, 다운로드 섹션에서 제공하는 코드 샘플들은 최대로 간단한 것이고 실험을 목적으로 한 것이다. SSL 서버 애플리케이션들을 실제로 구현하기 전에, 최신 보안 권고 사항을 읽어보기 바란다.
다운로드 하십시오
교육
제품 및 기술 얻기
토론
|
'인증기술 > PKI 기술' 카테고리의 다른 글
안드로이드 개인 인증서 추가 관련 정보 (0) | 2018.12.27 |
---|---|
Simple Certificate Enrollment Protocol (SCEP) (0) | 2018.10.10 |
OpenSSL API를 이용한 보안 프로그래밍, Part 2: 안전한 핸드쉐이크(handshake) (한글) (0) | 2018.10.08 |
OpenSSL API를 이용한 보안 프로그래밍, Part 1: API의 개요 (한글) (0) | 2018.10.08 |
PKI:Public key infrastructure는 어떻게 동작할까? (0) | 2018.10.08 |