ก่อนที่จะมาอ่านโพสนี้ ต้องมีความรู้พื้นฐานทางด้าน Public Key/ Private Key เข้าใจว่า rsa ทำงานอย่างไร แล้วค่อยมาอ่านนะครับ ปล. สิ่งที่เขียนลงไป ผมอาจจะเข้าใจคลาดเคลื่อนไปบ้าง อ่านเอาโดยรวมก็แล้วกัน ตย.ข้างล่างนี้ ได้ลองทำแล้ว แต่อาจจะมีเปลี่ยนแปลงบ้างนิดหน่อย
Certificate
จากเรื่องของ Public Key/Private Key certificate คือใบรับรองที่มี public key อยู่ภายใน เนื่องจาก public key สามารถสร้างจาก private key ได้ไม่ยาก ดังนั้นก่อนที่จะมี certificate หรือ certificate request เราจึงต้องทำการสร้าง private key ก่อน
openssl genrsa -out privatekey.pem 2048
DER vs PEM vs CER vs CRT
Der และ Pem จะพบเห็นได้จากนามสกุลไฟล์ โดยท้ังคู่นั้นเป็น encoder ที่ใช้สำหรับ encode certificate/key ที่ gen ออกมาเสร็จแล้วให้อยู่ในรูปแบบมาตราฐาน (ที่ไม่ได้เป็นมาตราฐาน) โดย der นั้นจะเป็นการ encode แบบ binary ส่วน pem นั้นเป็นการใช้ base64 ซึ่งจะออกมาเป็น ascii ธรรมดา ดังนั้นความแตกต่างของสองอันนี้นั่นก็คือเมื่อเราเปิดมันออกมาแล้ว เราจะอ่านไฟล์ที่เป็น pem ได้ออกมาเป็นตัวอักษรสวยงาม ส่วน der นั้นจะออกมายึกยือ ส่วน CER นั้นอาจจะเป็น der หรือ pem ก็ได้ แต่ cer หรือ crt นี้จะนิยมใช้ในฝั่ง MS ซึ่งเราสามารถ export cer ให้ออกมาอยู่ในรูปของ der/pem ก็ได้
CSR, CA
ย่อมาจาก Certificate Signing Request การจะสร้าง certificate นั้นจะต้องเริ่มจาก การขอ certificate จาก CA หรือ Certificate Authority เสียก่อน โดยเราจะทำการส่ง CSR ของเราไปให้ CA ทำการ Sign เพื่อให้ไปอยู่ในรูปของ Certificate เสียก่อน แล้วส่งกลับมาจึงจะใช้งานได้
openssl req -new -key privatekey.pem -out cert.csr
X.509
เป็นมาตารฐานฟอร์แมตในการจัดการ certificate ซึ่งจะประกอบไปด้วยข้อมูลดังต่อไปนี้ (http://en.wikipedia.org/wiki/X.509)
- Certificate
- Version
- Serial Number
- Algorithm ID
- Issuer
- Validity
- Not Before
- Not After
- Subject
- Subject Public Key Info
- Public Key Algorithm
- Subject Public Key
- Issuer Unique Identifier (optional)
- Subject Unique Identifier (optional)
- Extensions (optional)
- …
- Certificate Signature Algorithm
- Certificate Signature
Self-signed Certificate
ถ้าในกรณีที่เราไม่ต้องการส่ง certificate request ของเราออกไปให้ CA คนอื่น เราก็สามารถตั้งตัวเราเป็น CA ได้ แล้วหลังจากนั้นเราจะทำการส่ง root certificate (public key) ออกไปให้คนอื่นที่ต้องการมาติดต่อกับเรา ทำการ trust เสียก่อน การตั้งต้นเป็น CA ก็สามารถทำได้โดยการสร้าง Private Key หนึ่งตัวสำหรับ CA
openssl genrsa -out privateKeyCa.pem
openssl req -new -x509 -key privateKeyCa.pem -out cacert.pem -days 3650
เมื่อทำการตอบคำถามทั้งหลายเสร็จแล้ว เราก็จะได้ไฟล์ cacert.pem ออกมา ซึ่งไฟล์นี้ก็คือ public key ของเรา หากต้องการนำไปใช้บน windows ก็ให้เปลี่ยนเป็น cacert.crt เสียก่อน จะได้ double click ได้เลย
หลังจากที่เราเซทอัพ CA เรียบร้อยแล้ว เราก็ต้องมาทำการสร้าง certificate request สำหรับเครื่อง server หรือ พนักงงานที่เราต้องการ
ก่อนอื่นก็จะต้องมี privatekey ซึ่งเราสร้างไว้ตั้งแต่ต้นแล้ว แล้วจึงทำการขอ certificate request ด้วยคำสั่ง
openssl req -new -key privatekey.pem -out cert-request.pem
แล้วทำการ sign certificate นี้ด้วยคำสั่ง
openssl x509 -req -in cert-request.pem -CA cacert.pem -CAkeyprivateKeyCa.pem -set_serial 01 -out mycert.pem -days 3650
มาถึงจุดนี้ เราก็ทำการสร้าง Certificate เป็นที่เรียบร้อยแล้ว ที่นี้เราจะลองย้อนทบทวนดูว่า เราได้ทำอะไรไปบ้าง
mycert.pem คือ self-signed certificate ฉบับสมบูรณ์ของเรา
cert-request.pem คือ certificate signing request
privatekey.pem คือ private key ของเรา
privateKeyCa.pem คือ private key ของ CA (ห้าม exposed โดยเด็จขาด ไม่งั้นเราจะสูญเสียความเป็น CA ของเรา)
cacert.pem คือ root certificate ของเราที่สามารถออกให้คนอื่นเอาไป trust ได้ โดยหลังจาก trust root certificate แล้ว เราก็จะ trust certificate ทั้งหมดที่เกิดจาการ sign ของ CA นี้ด้วย เช่นเดียวกับ CA เจ้าใหญ่ๆจำพวก Verisign ที่ถูก trust มาด้วยกับ web browser ต่างๆที่เรา download มา
PKCS
public-key cryptography standards โดย PKCS version ที่เราจะเห็นกันบ่อยๆคือ PKCS#12 ซึ่งทำหน้าที่เป็น container คอยเก็บ private/public key และ certificate ซึ่งการเก็บข้อมูลเหล่านี้อยู่ในรูปของ PKCS#12 ทำให้เราสามารถนำเอาไป import ยัง application ที่เราต้องการได้ง่ายและสะดวกเพราะว่า ทั้งหมดรวมอยู่ในไฟล์เดียวกัน ซึ่งสามารถสร้างได้โดย openssl เช่นเดียวกัน
Keytool
เป็นโปรแกรมจัดการ Key/Certificate ที่มาพร้อมกับ Java โดยจะเก็บ key และ certificate เหล่านี้อยู่ในรูปของ keystore (jks) โดย keytool มีความสามารถคล้ายคลึงกับ OpenSSL โดยหากเราต้องการจะ import certificate เข้าไปใน keytool จะต้องทำการแปลงให้อยู่ในรูปแบบของ DER-encoded เสียก่อน เนื่องจาก Keytool ไม่รองรับ PEM แล้วหากต้องการจะ import keystore keystore นั้นจะต้องอยู่ในรูปแบบของ PKCS#12