Windows-MY คือประเภทของ keystore บน Windows ซึ่งจัดการโดยระบบปฏิบัติการ Windows มันเก็บ user keys และ certificates ซึ่งสามารถใช้ในการดำเนินการเข้ารหัสลับ เช่น การตรวจสอบลายเซ็น การเข้ารหัสข้อมูล เป็นต้น เนื่องจากเป็น keystore ชนิด native Java จึงไม่มี API ทั่วไปในการเข้าถึง
เพื่อช่วยให้แอปพลิเคชัน Java เข้าถึง keys และ certificates ที่เก็บไว้ใน Windows-MY keystore Java จึงมี API แยกต่างหาก -- SunMSCAPI SunMSCAPI provider นั้นถูกสร้างขึ้นบน CAPI และช่วยให้แอปพลิเคชันบน Java platform เข้าถึงบริการเข้ารหัสลับของ CAPI โดยใช้เทคโนโลยีความปลอดภัยและการเข้ารหัสลับของ Java ที่มีอยู่แล้ว นั่นหมายความว่า แอปพลิเคชันบน Java platform สามารถใช้ SunMSCAPI provider เพื่อทำสิ่งต่อไปนี้ได้:
- เข้าถึง private keys และ certificates ที่เก็บไว้ใน CAPI
- ใช้การใช้งานอัลกอริธึมการเข้ารหัสลับของ CAPI
ด้านล่างนี้เราจะแนะนำวิธีการใช้งาน Windows-MY keystore โดยใช้ Java
ในการเริ่มต้น คุณต้องเพิ่ม SunMSCAPI provider ลงในรายการ security providers เพื่อให้สามารถค้นหาได้เมื่อสร้าง KeyStore instance ในไฟล์ java.security ที่อยู่ที่ <JAVA_HOME>\lib\security ให้เพิ่มรายการด้านล่างนี้:
security.provider.10=sun.security.mscapi.SunMSCAPI
เปลี่ยนหมายเลข 10 ข้างต้นให้เหมาะสมกับแพลตฟอร์มของคุณ จากนั้นเราสามารถเริ่มใช้ Windows-MY ได้
โหลด keystore
ในการโหลด keystore เราเพียงแค่สร้าง KeyStore instance ปกติและระบุประเภท keystore เป็น Windows-MY
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // โหลด keystore } catch (Exception ex){ ex.printStackTrace(); }
ที่นี่ input ของ keystore คือ null และ password ก็เป็น null เช่นกัน เนื่องจากเรากำลังใช้งาน native Windows-MY keystore เราจึงไม่จำเป็นต้องใส่ input stream และ password ของ keystore API ที่อยู่เบื้องหลังจะค้นหา keystore โดยอัตโนมัติ
เก็บ private key และ certificate chain
Windows-MY สามารถใช้เพื่อเก็บ private keys และ certificate chains ที่เกี่ยวข้อง ในบทช่วยสอนนี้ เราจะใช้ CertAndKeyGen เพื่อสร้าง keys และ certificate chain ในแอปพลิเคชันจริง คุณอาจต้องใช้การดำเนินการที่ซับซ้อนกว่านี้
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // โหลด keystore // สร้าง private key และ certificate chain CertAndKeyGen certAndKeyGen = new CertAndKeyGen("RSA", "SHA256withRSA"); certAndKeyGen.generate(1024); Key key = certAndKeyGen.getPrivateKey(); X509Certificate cert = certAndKeyGen.getSelfCertificate(new X500Name("CN=JavaSecurity"), 365*24*60*60); X509Certificate[] chain = new X509Certificate[]{cert}; keyStore.setKeyEntry("mykey", key, null, chain); keyStore.store(null, null); } catch (Exception ex){ ex.printStackTrace(); }
เก็บ certificate
Windows-MY อนุญาตให้เก็บ certificate โดยไม่มี private key ที่เกี่ยวข้อง
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // โหลด keystore // สร้าง certificate CertAndKeyGen certAndKeyGen = new CertAndKeyGen("RSA", "SHA256withRSA"); certAndKeyGen.generate(1024); X509Certificate cert = certAndKeyGen.getSelfCertificate(new X500Name("CN=JavaSecurity1"), 365*24*60*60); keyStore.setCertificateEntry("mycertificate", cert); keyStore.store(null, null); } catch (Exception ex){ ex.printStackTrace(); }
โหลด certificate chain
ในการโหลด certificate chain เราเพียงแค่ต้องรู้เกี่ยวกับ certificate chain alias
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // โหลด keystore Certificate[] chain = keyStore.getCertificateChain("mykey"); for(Certificate cert : chain){ System.out.println(cert); } } catch (Exception ex){ ex.printStackTrace(); }
ผลลัพธ์มีลักษณะดังนี้:
[ [ Version: V3 Subject: CN=JavaSecurity Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 Key: Sun RSA public key, 1024 bits modulus: 115158915868692318987927322981993098184851087646271166814185733840839228006539416470914033601611753480811872595928340327418479810582683258819388853614402750121845039521565991998963853516232149701424900757572697209325472744440054065298957644144270547136759177167201092105624782153655544642521014196719366849149 public exponent: 65537 Validity: [From: Sat Jan 09 19:23:49 CST 2016, To: Sun Jan 08 19:23:49 CST 2017] Issuer: CN=JavaSecurity SerialNumber: [ 5fff31ae] ] Algorithm: [SHA256withRSA] Signature: 0000: 9C 1D 36 4E 31 CA CD A5 06 13 A5 7E A8 7B 0C 7F ..6N1........... 0010: 71 D9 0A 2B 19 82 28 D3 E0 9D A1 FD 5E 5E 8C CB q..+..(.....^^.. 0020: 77 77 AF 4B E1 29 27 D5 CE 77 8E 68 2C DA A4 30 ww.K.)'..w.h,..0 0030: CA 5F 66 5E B7 C8 4E 81 15 CB A9 56 5D 34 76 28 ._f^..N....V]4v( 0040: 42 59 65 C1 E2 7E D6 6D 1A A3 66 83 D2 1E C9 10 BYe....m..f..... 0050: 9F 05 75 E3 83 7D D2 70 FA 28 49 42 57 38 18 4B ..u....p.(IBW8.K 0060: E7 C9 17 8D 13 7C 81 F5 2C 5D 04 2E 15 04 77 60 ........,]....w` 0070: 85 7B 45 E7 A6 A7 C9 62 63 D4 26 50 83 38 74 AD ..E....bc.&P.8t. ]
โหลด certificate
กระบวนการโหลด certificate คล้ายกับการโหลด certificate chain เพียงแค่ต้องการ alias เท่านั้น
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // โหลด keystore Certificate cert = keyStore.getCertificate("mycertificate"); System.out.println(cert); } catch (Exception ex){ ex.printStackTrace(); }
ผลลัพธ์มีลักษณะดังนี้:
[ [ Version: V3 Subject: CN=JavaSecurity1 Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 Key: Sun RSA public key, 1024 bits modulus: 162643520607141934155239883471718040795513791129599245958918873228051267022145247869395776267777056508288312204117354041940752871832185392623715702004286759226626992223635150724845988723904884906298676925643542124198797189444002248973385583978516838174284232569476559210240169899741977273703497762888592391581 public exponent: 65537 Validity: [From: Sat Jan 09 19:35:04 CST 2016, To: Sun Jan 08 19:35:04 CST 2017] Issuer: CN=JavaSecurity1 SerialNumber: [ 65f0f6d6] ] Algorithm: [SHA256withRSA] Signature: 0000: BE 9F 8C 5D 02 A7 49 35 AE 66 75 2F C5 F2 2B D2 ...]..I5.fu/..+. 0010: BF 8D 37 F8 A3 DE 33 9C F8 64 96 67 E8 00 F6 B5 ..7...3..d.g.... 0020: 13 C6 CF 95 63 B2 14 BE 4D D1 AD 26 FF BF 5C BC ....c...M..&..\. 0030: F0 4F DD E7 A4 BC 9E 88 E5 23 CB 4C 0D B4 C6 8F .O.......#.L.... 0040: 4D B5 69 F5 EF 7F 90 66 29 59 9D 87 37 B9 A3 51 M.i....f)Y..7..Q 0050: 54 1C BF AF 54 6C 4B 72 47 3A 2A 3C B0 E9 08 C1 T...TlKrG:*<.... 0060: E1 A8 98 1A 7F CC F5 D1 5A 12 3F 70 A3 5A E6 F3 ........Z.?p.Z.. 0070: 3D 23 FD 04 45 3F EA 26 3B D8 D2 72 B6 A4 47 AA =#..E?.&;..r..G. ]
หากคุณต้องการทราบเกี่ยวกับ keystore ประเภทอื่นๆ ใน Java คุณสามารถดูได้ที่ ประเภทต่างๆ ของ keystore ใน Java -- ภาพรวม
And about Windows 10.
Exists the "Windows-MY"?