ก่อนที่จะมาอ่านโพสนี้ ต้องมีความรู้พื้นฐานทางด้าน 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 -CAkey privateKeyCa.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