자바 에서 디지털 인증서 생 성 및 유지보수

11749 단어 자바
자바 의 keytool. exe 는 디지털 인증 서 를 만 드 는 데 사용 할 수 있 습 니 다. 모든 디지털 인증 서 는 하나의 (별명 으로 구별) 형식 으로 인증서 라 이브 러 리 에 저 장 됩 니 다. 인증서 라 이브 러 리 의 인증 서 는 이 인증서 의 비밀 키, 공개 키 와 해당 하 는 디지털 인증서 의 정 보 를 포함 합 니 다.인증서 라 이브 러 리 의 인증 서 는 디지털 인증서 파일 을 내 보 낼 수 있 습 니 다. 디지털 인증서 파일 은 주체 정보 와 해당 하 는 공개 키 만 포함 합 니 다.
모든 인증서 라 이브 러 리 는 파일 로 구성 되 어 있 습 니 다. 접근 암호 가 있 습 니 다. 처음 만 들 때 인증 라 이브 러 리 를 자동 으로 생 성하 고 인증서 라 이브 러 리 에 접근 할 암 호 를 지정 하 라 고 요구 합 니 다.
인증 서 를 만 들 때 인증서 의 정보 와 인증서 에 해당 하 는 비밀 키 암 호 를 입력 해 야 합 니 다.이러한 정 보 는 CN = xx, OU = xx, O = xx, L = xx, ST = xx, C = xx 를 포함한다.
CN (Common Name 이름과 성씨)
OU (조직 단위 명칭)
O (조직 명)
L (Locality 도시 또는 지역 이름)
ST (State 주 또는 성 이름)
C (국가 명)
대화 식 으로 도구 가 상기 정 보 를 입력 하 는 것 을 알려 줄 수도 있 고 매개 변 수 를 사용 할 수도 있다.
- dname "CN = xx, OU = xx, O = xx, L = xx, ST = xx, C = xx" 를 자동 으로 생 성 합 니 다.
1. 예시
다음 과 같은 문장 은 인 터 랙 션 으로 인증 서 를 만 듭 니 다. 인증서 라 이브 러 리 를 abnerCALib 로 지정 하고 abnerCA 라 는 인증 서 를 만 듭 니 다. RSA 알고리즘 으로 생 성 할 것 을 지정 합 니 다.
키 길 이 를 1024 로 지정 하고 인증서 유효기간 은 3650 일 입 니 다.
C:\j2sdk1.4.1_01\mykeystore>keytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abnerCALib -validity 3650
우리 가 입력 한 것 은 CN 으로 중국 을 대표 하 는 줄 임 말 이 며 '중국' 이라는 두 글 자 를 직접 입력 할 수도 있다.
2. 인증서 의 조작 방법
● 인증서 표시
예:
keytool –list –keystore abnerCALib
abnerCALib 인증서 라 이브 러 리 의 모든 인증서 목록 을 표시 합 니 다: 다음 그림:
keytool - list - alias abnerCA - keystore abnerCALib
abnerCALib 인증서 라 이브 러 리 에 있 는 abnerCA 라 는 인증서 의 정 보 를 표시 합 니 다. 아래 그림 과 같 습 니 다.
keytool - list - v - alias abnerCA - keystore abnerCALib
다음 그림 과 같이 인증서 에 대한 자세 한 정보 (- v 인자) 를 표시 합 니 다.
● 인증서 파일 로 내 보 내기
예 를 들 어: keytool - export - alias abnerCA - file abnerCA. cer - keystore abnerCALib
인증서 라 이브 러 리 abnerCALib 의 별명 인 abnerCA 인증 서 를 abnerCA. cer 인증서 파일 로 내 보 냅 니 다.
이것 은 인증서 주체 의 정보 와 인증서 의 공개 키 를 포함 하고 비밀 키 를 포함 하지 않 으 며 다음 그림 과 같이 공개 할 수 있 습 니 다.
위 에서 내 보 낸 인증서 파일 은 바 이 너 리 인 코딩 파일 로 텍스트 편집기 로 정확하게 표시 할 수 없 기 때문에 인증 서 를 발표 하지 않 고 - rfc 인 자 를 추가 하여 인쇄 가능 한 컴 파 일 러 인 코딩 으로 출력 할 수 있 습 니 다.
예:
keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -storepass 100200 –rfc
이 명령 은 명령 줄 에 인증서 라 이브 러 리 의 접근 암 호 를 지정 하고 인 코딩 을 볼 수 있 는 방식 으로 출력 할 것 을 지정 합 니 다.
 
3. 인증서 파일 을 통 해 인증서 의 정 보 를 봅 니 다.
명령: keytool – printcert – file abnerCA. cer 를 통 해 인증서 파일 의 정 보 를 볼 수 있 습 니 다.
윈도 우즈 에서 인증서 파일 을 두 번 눌 러 서 직접 볼 수도 있 습 니 다.
● 인증서 항목 삭제
keytool 의 명령 행 인자 - delete 는 키 라 이브 러 리 의 항목 을 삭제 할 수 있 습 니 다. 예 를 들 어:
keytool -delete -alias abnerCA -keystore abnerCALib
  
이 명령 은 abnerCALib 라 이브 러 리 에 있 는 abnerCA 인증 서 를 삭제 합 니 다.
● 인증서 항목 구령 의 수정
예:
keytool –keypasswd –alias abnerCA –keystore abnerCALib
abnerCALib 인증서 라 이브 러 리 의 항목 을 abnerCA 인증서 로 대화 식 으로 수정 할 수 있 습 니 다.
Keytool –keypasswd –alias abnerCA –keypass 123456 –new 200100 –storepass 1002 00 –keystore abnerCALib
이 줄 명령 은 라 이브 러 리 에 있 는 abnerCA 라 는 인증서 의 비밀 번 호 를 새 비밀번호 123456 으로 변경 합 니 다. 줄 에 있 는 200100 은 이 인증서 의 원래 비밀 번 호 를 말 합 니 다. 100200 은 라 이브 러 리 의 비밀 번 호 를 말 합 니 다.
디지털 인증서 발급 (서명)
우 리 는 위 에 디지털 인증 서 를 만 들 었 지만, 이 디지털 인증 서 는 권위 있 는 CA 의 확인 (즉 서명) 을 거치 지 않 았 습 니 다. 일반적으로, 우 리 는 이 인증 서 를 권위 있 는 CA 에 보 내 고, 디지털 인증 서 를 고객 에 게 신뢰 할 수 있 도록 서명 을 신청 해 야 합 니 다.
다음은 권위 있 는 디지털 인증서 인증 기관 인 CA 를 모방 할 것 입 니 다. 이 기 구 는 자신의 비밀 키 를 사용 하여 다른 인증 서 를 발급 할 것 입 니 다. 이 발급 과정 은 다음 과 같 습 니 다. 저 희 는 CA 입 니 다. 저 희 는 스스로 서명 한 디지털 인증 서 를 디지털 인증서 라 이브 러 리 에 저장 합 니 다. 디지털 인증서 라 이브 러 리 에 있 는 이 CA 디지털 인증 서 는 비밀 키, 공개 키, 공개 키 를 포함 하고 있 습 니 다.이 CA 의 주체 정보 입 니 다. 다음 명령 은 CA 가 서명 한 디지털 인증 서 를 만 들 수 있 습 니 다.
keytool – genkey – dname "CN = 메 이 슨 시스템 소프트웨어 유한 공사, OU = 메 이 슨 시스템 소프트웨어 유한 공사, O = 메 이 슨 시스템 소프트웨어 유한 공사, L = 청 두 시, ST = 사천성, C = 중국" – alias MissionCA – keyalt RSA – keysize 1024 – keystore abnerCALib – keypass 200100 – storepass 100200 – validity 3650
위 에서 저 희 는 abnerCALib 라 는 디지털 인증서 라 이브 러 리 에 missionca 라 는 별명 을 만 들 었 습 니 다. 유효기간 은 3650 일 이 고 알고리즘 은 RSA 이 며 키 길 이 는 1024 인 디지털 인증서 입 니 다. 이 인증서 의 비밀 키 비밀 번 호 는 200100 이 고 인증서 라 이브 러 리 의 방문 비밀 번 호 는 100200 입 니 다. 이 별명 은 missionca 라 는 인증 서 는 우리 자신의 권위 적 인 CA 를 대표 합 니 다. 즉, 메 이 슨 시스템 소프트웨어 유한 공사 입 니 다.이 권위 있 는 CA 입 니 다. 앞으로 이 인증서 로 다른 디지털 인증서 에 서명 하 겠 습 니 다.
지금 나 는 자신 에 게 디지털 인증 서 를 신청 하려 고 한다. 나 는 이렇게 할 수 있다. 먼저 디지털 인증서 라 이브 러 리 에 인증 서 를 만 들 수 있다.
keytool – genkey – dname "CN = 차이 징, OU = 메 이 슨 시스템 소프트웨어 유한 공사, O = 메 이 슨 시스템 소프트웨어 유한 공사, L = 청 두 시, ST = 사천성, C = 중국" – alias abnerCA – keyalt RSA – keysize 1024 – keystore abnerCALib – keypass 200100 – storepass 100200 – validity 3650
이렇게 abnerCA 라 는 별명 을 가 진 디지털 인증 서 를 만 들 었 습 니 다. cer 파일 로 내 보 낼 수 있 습 니 다. (이전 참조)
이 어, 우 리 는 이전 단계 에 생 성 된 CA 의 자체 서명 인증서 로 이 디지털 인증 서 를 서명 할 수 있 습 니 다.
CA 가 디지털 인증 서 를 서명 하 는 과정 은 다음 과 같은 프로그램 으로 진행 되 어야 합 니 다. 이 프로그램 은 스스로 설명 합 니 다.
package com.security; import java.io.*; import java.security.*; import java.security.cert.*; import java.util.*; import java.math.*; import sun.security.x509.*; /** * <p>Description:         (CA)     ( CA   )       *        ,      CA                   </p> * @author abnerchai * @version 1.0 */  public class SignCert {   public static void main(String[] args) throws Exception{    char[] storepass = "100200".toCharArray();    //  CA                    char[] cakeypass = "200100".toCharArray();//CA               String alias = "missionCA";    //CA          ,  CA                String name = "abnerCALib";//  CA                  String newLib = "SignedLib";    //       ,               ,           char[] newLibPass = "100200".toCharArray();//             String cerFileName = "abnerCA.cer";//              String aliasName = "abnerCA";//          alias      char[] namePass = "200100".toCharArray();    //                    int n =3; //        ,     ,             int sn = 200406001;    //        ,        2004 6   ,    CA        001  ,        String afteraliasName = "abnerCA_Signed";    //                        char[] afterNewPass = "200100".toCharArray();    //                             //         FileInputStream in = new FileInputStream(name);    KeyStore ks = KeyStore.getInstance("JKS");//JKS           ks.load(in,storepass);    //          (CA)       java.security.cert.Certificate cl = ks.getCertificate(alias);    //    CA  ,   l   l     1    PrivateKey privateKey = (PrivateKey)ks.getKey(alias,cakeypass);    //           CA         in.close();    //           (CA)                byte[] encodl = cl.getEncoded();//       ,     l     1    X509CertImpl cimpl = new X509CertImpl(encodl);    //     l     1,         X509CertImpl         //         X509CertInfo     ,             。    X509CertInfo cinfo_first =     (X509CertInfo)cimpl.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);    //    X500Name            X500Name issuer = (X500Name)    cinfo_first.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);    //        ,              //        ,             ,           //////////////////////////////////////////////////////////////////////// //   、      cer      start /////////////////////////////////////////////////////////////////////////////// /*   CertificateFactory cf = CertificateFactory.getInstance("X.509");   //X.509                 FileInputStream in2 = new FileInputStream(cerFileName);//         java.security.cert.Certificate c2 = cf.generateCertificate(in2);   //            in2.close();   byte[] encod2 = c2.getEncoded();   X509CertImpl cimp2 = new X509CertImpl(encod2);   //           ,                X509CertInfo cinfo_second =    (X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); */ /////////////////////////////////////////////////////////////////////////////// //end     /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// //   、             start ///////////////////////////////////////////////////////////////////////////////   java.security.cert.Certificate c3 = ks.getCertificate(aliasName);   //           ,           byte[] encod3 = c3.getEncoded();   X509CertImpl cimp3 = new X509CertImpl(encod3);   X509CertInfo cinfo_second =    (X509CertInfo)cimp3.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); /////////////////////////////////////////////////////////////////////////// //end    /////////////////////////////////////////////////////////////////////////// //         ,       n   ,       //        CA          Date beginDate = new Date();   Calendar cal = Calendar.getInstance();   cal.setTime(beginDate);   cal.add(cal.YEAR,n);   Date endDate = cal.getTime();   CertificateValidity cv = new CertificateValidity(beginDate,endDate);   cinfo_second.set(X509CertInfo.VALIDITY,cv);   //            CertificateSerialNumber csn = new CertificateSerialNumber(sn);   cinfo_second.set(X509CertInfo.SERIAL_NUMBER,csn);   //            cinfo_second.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);   //      CA           //        ,  CA            md5WithRSA   AlgorithmId algorithm = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);   cinfo_second.set(CertificateAlgorithmId.NAME+"."+   CertificateAlgorithmId.ALGORITHM,algorithm);   //             X509CertImpl newcert = new X509CertImpl(cinfo_second);   //  ,  CA         ,        MD5WithRSA   newcert.sign(privateKey,"MD5WithRSA");//        CA         //            //                ,         ,   //      ,                    ,   //               。  ,  ,              //              ,       。        。 /////////////////////////////////////////////////////////////////////////// //   :       /////////////////////////////////////////////////////////////////////////// /* ks.setCertificateEntry(afteraliasName,newcert); FileOutputStream out = new FileOutputStream(newLib); //    signedLib,            ks.store(out,newLibPass); out.close(); */ /////////////////////////////////////////////////////////////////////////// //end     /////////////////////////////////////////////////////////////////////////// //           ,        //     ,             ,                 //               /////////////////////////////////////////////////////////////////////////// //   ,       /////////////////////////////////////////////////////////////////////////// //               PrivateKey prk = (PrivateKey)ks.getKey(aliasName,namePass); java.security.cert.Certificate[] cchain = {newcert}; //      ,            ,              ,          ks.setKeyEntry(afteraliasName,prk,afterNewPass,cchain); //                    FileOutputStream out2 = new FileOutputStream(name); ks.store(out2,storepass);//       ,              /////////////////////////////////////////////////////////////////////////// //end     /////////////////////////////////////////////////////////////////////////// } } 

     이 프로그램 을 실행 하면 MissionCA 인증 서 를 사용 하여 abnerCA 인증 서 를 발급 할 수 있 습 니 다. 실행 후 abnerCALib 에 abnerCA Signed 라 는 별명 을 가 진 디지털 인증 서 를 추가 하면 cer 파일 로 내 보 냅 니 다 (내 보 내기 방법 은 이전 참조).
이로써 우 리 는 CA 인증 서 를 사용 하여 디지털 인증서 로 서 명 했 습 니 다. windows 에서 내 보 낸 abnerCA Signend. cer 파일 을 두 번 누 르 면 다음 그림 과 같 습 니 다.
위의 그림 에서 인증서 정보 란 에 "이 인증 서 를 검증 할 수 없습니다" 라 고 표 시 된 이 유 는 이 디지털 인증서 의 발급 자 missionca 인증서 가 시스템 에 설치 되 어 있 지 않 기 때 문 입 니 다. 인증서 라 이브 러 리 에 있 는 missionca 라 는 이름 의 자체 서명 디지털 인증 서 를 cer 파일 로 내 보 낸 다음 시스템 에 설치 할 수 있 습 니 다. 이 인증 서 를 두 번 클릭 하면 다음 그림 과 같 습 니 다.
이 곳 에서, 우 리 는 자신의 CA 서명 으로 발급 되 는 개인 디지털 인증 서 를 받 았 습 니 다. 그리고 우리 자신의 CA 인증 서 를 시스템 에 설치 하여 시스템 이 신뢰 하 는 루트 인증서 가 되 었 습 니 다. 따라서 앞으로 우리 의 이 CA 인증서 서명 으로 발급 되 는 디지털 인증 서 는 시스템 의 신뢰 를 받 을 것 입 니 다.

좋은 웹페이지 즐겨찾기