Windows-MY là một loại kho khóa trên Windows được quản lý bởi hệ điều hành Windows. Nó lưu trữ các khóa người dùng và chứng chỉ có thể được sử dụng để thực hiện các hoạt động mật mã như xác minh chữ ký, mã hóa dữ liệu, v.v. Vì đây là một loại kho khóa gốc, Java không có API chung để truy cập vào nó.
Để giúp các ứng dụng Java truy cập các khóa và chứng chỉ được lưu trữ trong kho khóa Windows-MY, Java cung cấp một API riêng biệt — SunMSCAPI. Nhà cung cấp SunMSCAPI được xếp lớp trên CAPI và giúp các ứng dụng nền tảng Java truy cập các dịch vụ mật mã CAPI bằng cách sử dụng các API bảo mật và mật mã công nghệ Java hiện có. Điều này có nghĩa là các ứng dụng nền tảng Java giờ đây có thể sử dụng nhà cung cấp SunMSCAPI để thực hiện các việc sau:
- Truy cập các khóa riêng và chứng chỉ được lưu trữ trong CAPI
- Sử dụng các triển khai thuật toán mật mã của CAPI
Dưới đây, chúng ta sẽ giới thiệu cách vận hành kho khóa Windows-MY bằng Java.
Để bắt đầu, bạn phải thêm nhà cung cấp SunMSCAPI vào danh sách các nhà cung cấp bảo mật để nó có thể được tìm thấy khi tạo phiên bản KeyStore. Trong tệp java.security nằm tại <JAVA_HOME>\lib\security, thêm mục bên dưới:
security.provider.10=sun.security.mscapi.SunMSCAPI
Thay đổi số 10 ở trên cho phù hợp với nền tảng của bạn. Sau đó, chúng ta có thể bắt đầu sử dụng Windows-MY.
Tải kho khóa
Để tải kho khóa, chúng ta chỉ cần tạo một phiên bản KeyStore bình thường và cung cấp loại kho khóa Windows-MY.
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // Tải kho khóa } catch (Exception ex){ ex.printStackTrace(); }
Ở đây, đầu vào kho khóa là null và mật khẩu cũng là null. Vì chúng ta đang hoạt động trên kho khóa Windows-MY gốc, chúng ta không cần đặt luồng đầu vào kho khóa và mật khẩu. API cơ bản sẽ tự động định vị kho khóa.
Lưu khóa riêng và chuỗi chứng chỉ
Windows-MY có thể được sử dụng để lưu trữ các khóa riêng và chuỗi chứng chỉ liên quan của chúng. Trong hướng dẫn này, chúng ta sẽ sử dụng CertAndKeyGen để tạo các khóa và chuỗi chứng chỉ. Trong các ứng dụng thực tế, bạn có thể cần sử dụng các hoạt động phức tạp hơn.
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // Tải kho khóa // Tạo khóa riêng và chuỗi chứng chỉ 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(); }
Lưu chứng chỉ
Windows-MY được phép lưu trữ chứng chỉ mà không có khóa riêng tương ứng.
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // Tải kho khóa // Tạo chứng chỉ 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(); }
Tải chuỗi chứng chỉ
Để tải chuỗi chứng chỉ, chúng ta chỉ cần biết về bí danh chuỗi chứng chỉ.
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // Tải kho khóa Certificate[] chain = keyStore.getCertificateChain("mykey"); for(Certificate cert : chain){ System.out.println(cert); } } catch (Exception ex){ ex.printStackTrace(); }
Kết quả đầu ra trông như thế này:
[ [ 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. ]
Tải chứng chỉ
Quá trình tải chứng chỉ tương tự như tải chuỗi chứng chỉ. Chỉ cần một bí danh.
try{ KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); // Tải kho khóa Certificate cert = keyStore.getCertificate("mycertificate"); System.out.println(cert); } catch (Exception ex){ ex.printStackTrace(); }
Kết quả đầu ra trông như thế này:
[ [ 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. ]
Nếu bạn muốn tìm hiểu về các loại kho khóa khác trong Java, bạn có thể xem Tổng quan về các loại kho khóa khác nhau trong Java.
And about Windows 10.
Exists the "Windows-MY"?