Generating CSR using Java

  sonic0002        2016-05-25 04:49:17       26,744        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

คำขอลงนามใบรับรอง (CSR) CSR(Certificate Signing Request) คือคำขอชนิดหนึ่งที่สร้างโดยแอปพลิเคชันและจะถูกส่งไปยังหน่วยงานออกใบรับรองเพื่อสร้างใบรับรองที่ลงนามแล้วซึ่งสามารถแจกจ่ายได้ โดยปกติแล้วจะประกอบด้วยข้อมูลใบรับรอง เช่น ชื่อผู้ใช้ คีย์สาธารณะ และข้อมูลลายเซ็น

ใน Java สามารถใช้ keytool เพื่อสร้างคำขอใบรับรองโดยใช้ตัวเลือก -certreq แต่บางครั้งหากแอปพลิเคชันต้องการสร้าง CSR โดยโปรแกรม keytool จะไม่ช่วย ในทางกลับกัน คุณควรใช้ API ที่ Java จัดเตรียมไว้เพื่อสร้าง CSR

โดยพื้นฐานแล้ว ขั้นตอนในการสร้าง CSR คือ:

  1. รับคู่คีย์ที่ขอ CSR สำหรับคู่คีย์นี้ สามารถสร้างได้ด้วย KeyPairGenerator หรือโหลดจาก keystore (แนะนำ)
  2. สร้างหัวเรื่องสำหรับคำขอใบรับรองและสร้างลายเซ็นสำหรับคำขอใบรับรอง
  3. ลงนามในคำขอใบรับรองด้วยคีย์ส่วนตัวจากคู่คีย์ในข้อ 1
  4. รับข้อมูลคำขอใบรับรองที่เข้ารหัสแล้ว เก็บไว้ และส่งไปยัง CA เพื่อสร้างใบรับรอง

เพื่อจุดประสงค์ในการสาธิต เราจะรับคู่คีย์โดยใช้ KeyPairGenerator แต่ในแอปพลิเคชันจริง ควรเก็บคู่คีย์ไว้ใน keystore

ด้านล่างนี้เป็นตัวอย่างการสร้างคำขอใบรับรองด้วย RSA

public class CSRGenerator {
	public static void main(String[] args) {
		CSRGenerator csrGeneration = new CSRGenerator();
		
		// สร้างคู่คีย์
		KeyPair keyPair = csrGeneration.generateKeyPair("RSA", 1024);
		System.out.println("KeyPair generated");
		
		byte[] csrData = csrGeneration.generateCSR("SHA256WithRSA", keyPair);
		
		System.out.println(new String(csrData));
	}
	
	/**
	 * สร้าง CSR ที่ต้องการสำหรับการลงนาม
	 * 
	 * @param sigAlg
	 * @param keyPair
	 * @return
	 */
	byte[] generateCSR(String sigAlg, KeyPair keyPair) {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		PrintStream printStream = new PrintStream(outStream);
		
		try {
			X500Name x500Name = new X500Name("CN=EXAMPLE.COM");
			
			Signature sig = Signature.getInstance(sigAlg);
			
			sig.initSign(keyPair.getPrivate());

			PKCS10 pkcs10 = new PKCS10(keyPair.getPublic());
//			pkcs10.encodeAndSign(new X500Signer(sig, x500Name));   // สำหรับ Java 6
			pkcs10.encodeAndSign(x500Name, sig);                   // สำหรับ Java 7 และ Java 8
			pkcs10.print(printStream);
	        
			byte[] csrBytes = outStream.toByteArray();
			
			return csrBytes;
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if(null != outStream) {
				try {
					outStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(null != printStream) {
				printStream.close();
			}
		}
		
		return new byte[0];
	}

	/**
	 * สร้างคู่คีย์ที่ต้องการ
	 * 
	 * @param alg
	 * @param keySize
	 * @return
	 */
	KeyPair generateKeyPair(String alg, int keySize) {
		try{
			KeyPairGenerator keyPairGenerator = null;
			keyPairGenerator = KeyPairGenerator.getInstance(alg);
			
			keyPairGenerator.initialize(keySize);
			
			return keyPairGenerator.generateKeyPair();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
		return null;
	}
}

โปรดทราบว่ามีความแตกต่างระหว่าง Java 6 และ Java 7 ในการเรียกใช้ PKCS10.encodeAndSign() Java 7 ไม่มี X500Signer อีกต่อไป

หากคุณใช้ IBM Java แทน Oracle Java จะมีความแตกต่างกันในวิธีการสร้างคำขอใบรับรอง ดูด้านล่าง

public class CSRGenerator {
	public static void main(String[] args) {
		CSRGenerator csrGeneration = new CSRGenerator();
		
		// สร้างคู่คีย์
		KeyPair keyPair = csrGeneration.generateKeyPair("RSA", 1024);
		System.out.println("KeyPair generated");
		
		byte[] csrData = csrGeneration.generateCSR("SHA256WithRSA", keyPair);
		
		System.out.println(new String(csrData));
	}
	
	/**
	 * สร้าง CSR ที่ต้องการสำหรับการลงนาม
	 * 
	 * @param sigAlg
	 * @param keyPair
	 * @return
	 */
	byte[] generateCSR(String sigAlg, KeyPair keyPair) {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		PrintStream printStream = new PrintStream(outStream);
		
		try {
			X500Name x500Name = new X500Name("CN=EXAMPLE.COM");
			
	        CertificateExtensions ext = new CertificateExtensions();
	        PKCSAttributes attrs = new PKCSAttributes().addAttribute(new PKCSAttribute(PKCSOID.EXTENSION_REQUEST_OID, ext));
	        
	        CertificationRequestInfo certInfo = new CertificationRequestInfo(x500Name, keyPair.getPublic(), attrs);
	        CertificationRequest request = new CertificationRequest(certInfo);
	        request = request.sign(sigAlg, keyPair.getPrivate());
	        request.print(printStream);
	        
			byte[] csrBytes = outStream.toByteArray();
			
			return csrBytes;
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if(null != outStream) {
				try {
					outStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(null != printStream) {
				printStream.close();
			}
		}
		
		return new byte[0];
	}

	/**
	 * สร้างคู่คีย์ที่ต้องการ
	 * 
	 * @param alg
	 * @param keySize
	 * @return
	 */
	KeyPair generateKeyPair(String alg, int keySize) {
		try{
			KeyPairGenerator keyPairGenerator = null;
			keyPairGenerator = KeyPairGenerator.getInstance(alg);
			
			keyPairGenerator.initialize(keySize);
			
			return keyPairGenerator.generateKeyPair();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
		return null;
	}
}

คำขอใบรับรองที่สร้างขึ้นในรูปแบบการเข้ารหัส BASE64 ควรมีลักษณะดังนี้:

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBZjCB0AIBADAWMRQwEgYDVQQDEwtFWEFNUExFLkNPTTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEAgXneACRkW0QvpuuNhzo8OOmxe7xPzd3UZJ9MOEA5VhP5QvWGMGFNITGmubL1I2AWmsHz
yMxwO0SHPFNclo4oSm+Cu2d67d28vingYBGEBrVXIwg3j1CVADcGjb39TcYL77fofBem8XNDCw0N
WKLaTqpnVaAtqvnE0+r7O3BZZg8CAwEAAaARMA8GCSqGSIb3DQEJDjECMAAwDQYJKoZIhvcNAQEL
BQADgYEAb5jNx6ASGpgTXTNz5UrD6BrTyLZYyTmlQwI0EjhG0lVY5sYiQGz7t6JQP62aqRFfM7vo
dYMnKxeuApp5LSY3EdyY1F5I20PPTbpSSP529pV5gIQZk4FZMoth7dvWgBH3pqB0BkHQ1g+wdWof
m2imkOR1D+7Yn6xvQ/Be9mXienU=
-----END NEW CERTIFICATE REQUEST-----

หวังว่าสิ่งนี้จะช่วยคุณได้หากคุณกำลังดิ้นรนกับการสร้างคำขอใบรับรองใน Java

CSR  CERTIFICATE REQUEST  SECURITY  JAVA 

       

  RELATED


  0 COMMENT


No comment for this article.



  RANDOM FUN

How functional testing works