인증서

OpenSSL 기반 자체 서명 인증서 생성하기

인증서 생성은 리눅스 운영체제에서 테스트했습니다.

대부분의 리눅스 배포판에는 OpenSSL 패키지가 설치되어 있습니다.

OpenSSL 버전 확인

두 개의 명령어 중 하나를 선택해서 버전을 확인할 수 있습니다.

$ rpm -qa openssl 
$ openssl version

개인키 생성

명령어 입력 후, 패스워드를 설정하면 개인키가 생성됩니다.

$ openssl genrsa -des3 -out xpush.key 2048

명령어를 입력하면 아래와 같이 패스워드를 묻습니다.

$ keytool -importkeystore -destkeystore APNs-Certificates.jks
                           -srckeystore APNs-Certificates.p12 -srcstoretype PKCS12

인증 요청서 생성

인증서를 신청하기 위해 인증 요청서가 필요합니다.

$ openssl req -new -key xpush.key -out xpush.csr

인증요청서의 이름을 지정하여 명령어 입력 후, 패스워드를 묻습니다. 패스워드 지정 후 추가 정보를 입력합니다.

추가 속성 정보는 입력하지 않고, Enter 키를 두 번 입력하면 인증요청서가 생성됩니다.

개인 키 패스워드 제거 및 인증서 생성

키에 패스워드가 들어있으면, 웹 서버에 설정할 경우 비밀번호를 계속 물어볼 경우가 생기므로 개인 키 패스워드를 제거하고 인증서를 생성하는 것이 좋습니다.

$ cp xpush.key xpush.key.origin 
$ openssl rsa -in xpush.key.origin -out xpush.key

xpush.key.origin의 패스워드를 입력하면, 패스워드가 제거된 개인키가 생성됩니다.

개인키 xpush.key 파일과 인증요청서 xpush.csr을 통해 crt 인증서를 생성할 수 있습니다.

$ openssl x509 -req -days 365 -in xpush.csr -signkey xpush.key -out xpush.crt

xpush.key.origin의 패스워드를 입력하면, 패스워드가 제거된 개인키가 생성됩니다.

.crt 파일을 통해 인증서 포맷을 변경할 수 있으며 jks, pem, pcks 등의 확장자 파일로 변환이 가능합니다.

https://www.securesign.kr/guides/SSL-Certificate-Convert-Format

X-PUSH 서버에서는 클라이언트와의 암호화 통신을 지원하며, jks 파일을 통해 Certificate Service의 설정하여 SSL 프로토콜을 사용할 수 있습니다.

JKS 인증서 파일 생성하기

아래의 명령어를 통해 .jks 인증서 파일을 생성할 수 있습니다.

$ keytool -genkey -v -keystore xpush.jks -alias server_private -keyalg RSA -sigalg MD5withRSA -keysize 1024 -validity 365

명령어 입력 후, 패스워드와 인증서 정보를 입력합니다.

PKCS12 파일을 JKS 형식으로 변환하기

JDK 1.7 이상 버전에서 APNs로 Notification을 전송할 경우, SSL 관련 오류가 발생하거나 APNs로부터 InvalidToken 에러 코드를 받을 수 있습니다. 이는 APNs 인증서 파일을 PKCS12 형식에서 JKS 형식으로 변환하여 해결할 수 있습니다.

APNs 인증서 파일은 JDK내에 포함되는 keytool을 사용하여 변환할 수 있으며, keytool은 JDK가 설치된 경로의 bin 디렉토리에 있습니다.

아래 예제는 keytool을 사용하여 APNs-Certificates.p12 파일을 APNs-Certificates.jks 파일로 변환하는 명령어 예를 보여주고 있습니다.

$ keytool -importkeystore -destkeystore APNs-Certificates.jks
                           -srckeystore APNs-Certificates.p12 -srcstoretype PKCS12

명령어를 입력하면 아래와 같이 패스워드를 묻습니다.

Enter destination keystore password:
Re-enter new password:
Enter source keystore password:

순서대로 새로 생성할 JKS 형식 인증서의 패스워드 입력, 패스워드 재입력, PKCS12 형식의 원본 인증서 패스워드를 입력하여 인증서를 생성합니다.

아래 그림은 keytool을 사용하여 APNs-Certificates.p12파일을 APNs-Certificates.jks로 변환하는 예를 보여줍니다.

keytool을 사용하여 PKCS12 형식을 JKS 형식으로 변환

변환된 JKS 형식 인증서를 다음과 같이 설정합니다.
KeystoreType 항목을 인증서 형식에 맞도록 JKS로 변경합니다.
<service name="ApnsNotifierService" ... >
	...
	<attribute name="KeystorePath">conf/APNs-Certificates.jks</attribute>
	<attribute name="KeystorePassword">xpush</attribute>
	<attribute name="KeystoreType">JKS</attribute>
	<attribute name="production">false</attribute>
	<attribute name="badge">true</attribute>
	<attribute name="retries">3</attribute>
	...
</service>

APNS 인증서 만들기

애플 개발자 센터 접속

1

애플 개발자 센터 접속 developer.apple.com

로그인하려면 Account 메뉴 선택

00-dev-apple-00-select-accn-menu

2

계정 입력하고 로그인

00-dev-apple-01-log-in

3

Certificates, IDs & Profiles 선택하여 인증서 관리 화면으로 이동.

00-dev-apple-02-select-cert-menu

인증서 만들기

1

화면 우상단의 더하기( + ) 버튼 선택하여 인증서 생성 시작.

01-gen-cert-01-new-cert

2

개발용(Sandbox) 또는 개발/운영 겸용(Sandbox & Production) 인증서 유형 선택.

01-gen-cert-02-select-cert-type

3

생성될 인증서의 App ID 선택.

01-gen-cert-03-select-app-id

4

CSR 파일 생성 요청

01-gen-cert-04-create-csr

CSR(인증요청서) 만들기

1

키체인 접근 - 인증서 지원 - 인증기관에서 인증서 요청

02-gen-csr-01-req-cert

02-gen-csr-02-sav-disk

02-gen-csr-03-naming-csr

인증 요청서는 앱마다 따로 만들어야 합니다. 예를 들어 APP1과 APP2의 인증 요청서를 같이 사용할 경우 푸쉬 알림을 같은 앱으로 받게 될 수 있습니다.

2

생성한 csr파일을 업로드

인증서 만들기 완료

01-gen-cert-05-upload-csr

03-gen-cert-01-cert-ready

03-gen-cert-02-complete

APNS 인증서 .p12 형식으로 내보내기

04-export-p12-02-export-with-prv-key

04-export-p12-03-sav-p12

04-export-p12-04-set-passwd

APNS 인증서 갱신하기

APNS 인증서가 만료되면, 인증서를 갱신해야합니다. 인증서 갱신은 기존 인증서를 폐기하고 새로운 인증서를 만드는 형식입니다.

APNS 인증서를 갱신하기 전 , CSR 파일은 인증서마다 별도로 만들어야 합니다.

X-PUSH 서버에 갱신된 인증서를 사용하였더라도, 클라이언트 앱의 설정된 인증서 또한 만료되었다면 푸쉬 알림을 받지 못할 수 있습니다.

인증서 revoke

동일한 방법으로 APNS 인증서 만들기수행