Different types of keystore in Java -- Windows-MY

  Pi Ke        2016-01-09 05:45:59       36,834        6          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

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.

JAVA  KEYSTORE  WINDOWS-MY  SUNMSCAPI 

       

  RELATED


  6 COMMENTS


Anonymous [Reply]@ 2016-03-29 10:27:17

And about Windows 10.

Exists the "Windows-MY"?

Ke Pi [Reply]@ 2016-03-29 21:52:25

Sorry I don't have a Windows 10 yet. So didn't test it on Windows 10. You can give a try if you have Windows 10 :)

Anonymous [Reply]@ 2016-06-16 21:09:56

If I have a token device fully configured on my pc, and I can see the certificates stored on a token. (I can see them via Internet Explorer options)

Is it possible to retrieve the certificates from the SmartCard with the SunMSCAPI provider for digital signing??

 

Thanks. 

Chris

 

Ke Pi [Reply]@ 2016-06-17 07:50:39

Hi, Chris,

SunMSCAPI is to manage Window-MY keystore. Your Smart Card should be a HSM which needs to be handled using PKCS11 provider. PKCS11 API is used to access hardware keystores.

As for the certificate extraction, t depends on whether your smart card allows the certificate to be extracted or not. Some smart cards are designed so that nothing can be extracted from it. But some do allow extraction. So check with your card vendor specification on this.

 

Anonymous [Reply]@ 2016-06-19 21:54:38

I see, that means that i can only perform digital signing via PKCS11 API but not indirectly via SunMSCAPI. 

Thank you so much.

Chris

Anonymous [Reply]@ 2018-02-08 08:02:24

Is there any way to find out the list of all Personal certificate installed on a windows 10 machine using any JAVA?

Looking for using it to automate a test case where using java or/and selenium script need to find out a specific personal certificate that installed on a Windows 10 device.



  RANDOM FUN

(male + female) / 2 = ?

(male + female) / 2 = email. That's the case.