คำขอลงนามใบรับรอง (CSR) CSR(Certificate Signing Request) คือคำขอชนิดหนึ่งที่สร้างโดยแอปพลิเคชันและจะถูกส่งไปยังหน่วยงานออกใบรับรองเพื่อสร้างใบรับรองที่ลงนามแล้วซึ่งสามารถแจกจ่ายได้ โดยปกติแล้วจะประกอบด้วยข้อมูลใบรับรอง เช่น ชื่อผู้ใช้ คีย์สาธารณะ และข้อมูลลายเซ็น
ใน Java สามารถใช้ keytool เพื่อสร้างคำขอใบรับรองโดยใช้ตัวเลือก -certreq แต่บางครั้งหากแอปพลิเคชันต้องการสร้าง CSR โดยโปรแกรม keytool จะไม่ช่วย ในทางกลับกัน คุณควรใช้ API ที่ Java จัดเตรียมไว้เพื่อสร้าง CSR
โดยพื้นฐานแล้ว ขั้นตอนในการสร้าง CSR คือ:
- รับคู่คีย์ที่ขอ CSR สำหรับคู่คีย์นี้ สามารถสร้างได้ด้วย KeyPairGenerator หรือโหลดจาก keystore (แนะนำ)
- สร้างหัวเรื่องสำหรับคำขอใบรับรองและสร้างลายเซ็นสำหรับคำขอใบรับรอง
- ลงนามในคำขอใบรับรองด้วยคีย์ส่วนตัวจากคู่คีย์ในข้อ 1
- รับข้อมูลคำขอใบรับรองที่เข้ารหัสแล้ว เก็บไว้ และส่งไปยัง 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
No comment for this article.