ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [spring][java][bouncycastle] 인증서 발급하기
    금융프로젝트 2022. 10. 20. 15:16

    SSL

    Secure Socket Layer 은 서버와 클라이언트 사이에 암호화된 링크를 구성하기 위한 표준 보안 기술이다. 일반적으로 웹 서버와 브라우저, 또는 메일 서버와 메일 클라이언트 간에 설정됩니다.

    SSL은 신용카드번호, 주민등록번호, 로그인 자격 증명과 같이 민감한 정보를 안전하게 전송할 수 있도록 한다. 일반적으로 브라우저와 웹 서버 사이에 전송되는 데이터는 일반 텍스트로 전송되기 때문에 여전히 도청에 취약하다. 브라우저와 웹 서버 사이에 전송되는 모든 데이터를 공격자가 가로챌 수 있다면 공격자는 그러한 정보를 확인하고 악용할 수 있다.

    모든 브라우저는 SSL 프로토콜을 사용해 보안 웹 서버와 상호작용할 수 있는 기능이 있다. 그러나 브라우저와 서버는 보안 연결을 수립하기 위해 SSL 인증서라는 것이 필요하다.

    SSL인증서

    브라우저가 SSL로 보호된 웹사이트에 접속하려 할 때 브라우저와 웹 서버는 “SSL 핸드셰이크”라는 프로세스를 사용해 연결을 수립한다.

    SSL연결을 설정하는 데에는 공개키, 개인키, 세션키라는 세가지 키가 사용된다. 공개 키로 암호화된 모든 데이터는 개인 키로만 해독할 수 있고, 반대도 마찬가지다. 공개키 개인키로 암호화 및 복호화를 진행하고 세션키를 생성하여 보안 연결이 설정된 후에는 세션키가 사용된다.

    인증서 발급하기

    • bouncycastle 라이브러리 설치
    
    		
    			org.bouncycastle
    			bcprov-jdk16
    			1.38
    		
    
    • Cert.java
    public static void makeCert() throws CertificateException, IOException, InvalidKeyException, IllegalStateException, NoSuchAlgorithmException, SignatureException {
    		System.out.println("cert");
    		 
    		genCert(genKey());
    		
    	}
    
    • Cert.java - genKey 개인키를 만드는 method
    public static KeyPair genKey() throws FileNotFoundException, IOException, NoSuchAlgorithmException {
    		ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:\\\\cert\\\\temisone.key"));
    		KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    		kpg.initialize(1024);
    		KeyPair mKeyPair = kpg.genKeyPair();
    		
    		os.writeObject(mKeyPair);
    		os.close();
    		return mKeyPair;
    	}
    
    • Cert.java - genCert 인증서를 만드는 method
    public static void genCert(KeyPair inpKpair) throws CertificateEncodingException, IOException, InvalidKeyException, IllegalStateException, NoSuchAlgorithmException, SignatureException {
    		X509V3CertificateGenerator v3CertGen = new X509V3CertificateGenerator();
    		v3CertGen.setSerialNumber(new BigInteger("1234"));
    		v3CertGen.setIssuerDN(new X509Principal("CN=temisone, OU=temisone, O=Company, L=Seoul, C=KR"));
    		v3CertGen.setNotBefore(new Date());
    		v3CertGen.setNotAfter(new Date(System.currentTimeMillis()+1000L*60*60*24*365*10));
    		v3CertGen.setSubjectDN(new X509Principal("CN=temisone, OU=temisone, O=Company, L=Seoul, C=KR"));
    		v3CertGen.setPublicKey(inpKpair.getPublic());
    		v3CertGen.setSignatureAlgorithm("SHA1withRSA");
    		
    		X509Certificate pKCertificate = v3CertGen.generate(inpKpair.getPrivate());
    		FileOutputStream fos = new FileOutputStream("C:\\\\cert\\\\temisone.crt");
    		fos.write(pKCertificate.getEncoded());
    		fos.close();
    	}
    

    이렇게 하면 crt, key 확장자의 인증서 발급은 끝난다.

    하지만 인증서에 정보를 담고 인증서를 통해 검증하는 방법은 더 찾아봐야겠다.

    댓글

Designed by Tistory.