Different types of keystore in Java -- BKS

  Pi Ke        2016-07-03 03:00:18       33,453        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

BKS là một định dạng kho khóa được cung cấp bởi nhà cung cấp thư viện mật mã Java bên thứ ba phổ biến -- BouncyCastle. Nó là một kho khóa tương tự như JKS được cung cấp bởi Oracle JDK. 

Trước khi bắt đầu sử dụng BKS, nhà cung cấp BouncyCastle phải được tải xuống và cài đặt. Để tải xuống nhà cung cấp, vui lòng truy cập trang tải xuống BouncyCastle. Nhà cung cấp có thể được cài đặt bằng cách thêm một mục trong tệp java.security.

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider

N nghĩa là chỉ mục nhà cung cấp trong danh sách nhà cung cấp.

Tạo kho khóa BKS

Để tạo một kho khóa BKS, bạn chỉ cần tạo một thể hiện KeyStore của "BKS" và tải luồng đầu vào null và mật khẩu null.

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(null, null);

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

Lưu khóa bí mật

Khác với JKS, các khóa bí mật có thể được lưu trữ trong kho khóa BKS. Trước khi lưu trữ khóa, các tệp chính sách không bị hạn chế có thể cần thiết.

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
Key key = keyGenerator.generateKey();

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

keyStore.setKeyEntry("aeskey", key, "password".toCharArray(), null);

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

Lưu khóa riêng

Thay vì khóa bí mật, khóa riêng cũng có thể được lưu trữ trong BKS. Nó yêu cầu chuỗi chứng chỉ tương ứng được lưu trữ cùng một lúc. Nếu không, ngoại lệ sẽ được ném ra.

CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
gen.generate(1024);
 
Key key=gen.getPrivateKey();
X509Certificate cert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600);
 
X509Certificate[] chain = new X509Certificate[1];
chain[0]=cert;

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

keyStore.setKeyEntry("rsakey", key, "password".toCharArray(), chain);

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

Lưu chứng chỉ

Đôi khi khi cần một kho lưu trữ đáng tin cậy, không cần lưu trữ khóa trong kho khóa, chỉ cần chứng chỉ. BKS hỗ trợ lưu trữ chứng chỉ mà không cần khóa riêng tương ứng.

 CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
 gen.generate(1024);
     
 X509Certificate cert=gen.getSelfCertificate(new X500Name("CN=SINGLE_CERTIFICATE"), (long)365*24*3600);
 
 KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
 keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

 keyStore.setCertificateEntry("rsacert", cert);

 keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

Lưu ý, để lưu trữ chứng chỉ, không cần mật khẩu vì chứng chỉ thường không cần được bảo vệ.

Tải khóa

Khi tải khóa từ kho khóa, chỉ cần chỉ định bí danh của mục khóa. Nếu đó là khóa riêng, bạn có thể muốn sử dụng cùng một bí danh để tải chuỗi chứng chỉ.

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

Key key = keyStore.getKey("rsakey", "password".toCharArray());

Certificate[] chain = (Certificate[]) keyStore.getCertificateChain("rsakey");
for(java.security.cert.Certificate cert:chain){
    System.out.println(cert.toString());
}

Kết quả đầu ra có thể giống như

  [0]         Version: 3
         SerialNumber: 1676692330
             IssuerDN: CN=ROOT
           Start Date: Sun Jul 03 15:29:46 CST 2016
           Final Date: Mon Jul 03 15:29:46 CST 2017
            SubjectDN: CN=ROOT
           Public Key: RSA Public Key
            modulus: 813dd8db5d26940347116b4986eb7bc89fa423c9d9374a422f2951c9a258458175d97ac586a94da851885453e368e249e1c3b14751a80e8d3ec4dc6be19bfd968fa59209f7d032215946e4ad9b0e261d488a35af250e8dbcb9d0fa5c0c309a2be8fe9535950b9b4c6cdca25f9c2e50ed2786bcbce6b2971c80edef9691ae5d63
    public exponent: 10001

  Signature Algorithm: SHA1WITHRSA
            Signature: 00362e9e84c5dd02ed6cf589625257abe55d3c5c
                       fdde5cee362222147b5870b89909e3008567e29b
                       9b4b5c72342219d167dd058b7d1c59ca4696db4e
                       28ee791989e731fba86ebb1b2caedce98af2a5e7
                       44a026cc01d9b4b65e0a65b19a684b1b99b71afe
                       4d27412e852d977a2855e9f011918ac528555469
                       aeb8406756185b44

Tải chứng chỉ

Điều này tương tự như tải khóa, bí danh cần thiết để tải chứng chỉ.

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

Certificate cert = (Certificate) keyStore.getCertificate("rsakey");
System.out.println(cert.toString());

Kết quả đầu ra có thể giống như

  [0]         Version: 3
         SerialNumber: 1676692330
             IssuerDN: CN=ROOT
           Start Date: Sun Jul 03 15:29:46 CST 2016
           Final Date: Mon Jul 03 15:29:46 CST 2017
            SubjectDN: CN=ROOT
           Public Key: RSA Public Key
            modulus: 813dd8db5d26940347116b4986eb7bc89fa423c9d9374a422f2951c9a258458175d97ac586a94da851885453e368e249e1c3b14751a80e8d3ec4dc6be19bfd968fa59209f7d032215946e4ad9b0e261d488a35af250e8dbcb9d0fa5c0c309a2be8fe9535950b9b4c6cdca25f9c2e50ed2786bcbce6b2971c80edef9691ae5d63
    public exponent: 10001

  Signature Algorithm: SHA1WITHRSA
            Signature: 00362e9e84c5dd02ed6cf589625257abe55d3c5c
                       fdde5cee362222147b5870b89909e3008567e29b
                       9b4b5c72342219d167dd058b7d1c59ca4696db4e
                       28ee791989e731fba86ebb1b2caedce98af2a5e7
                       44a026cc01d9b4b65e0a65b19a684b1b99b71afe
                       4d27412e852d977a2855e9f011918ac528555469
                       aeb8406756185b44

Xóa mục

Việc xóa một mục trong kho khóa là một việc dễ dàng. Mục đó có thể là khóa bí mật, khóa riêng và chứng chỉ. Bí danh là thứ duy nhất cần được chỉ định.

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

keyStore.deleteEntry("aeskey");

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

Để việc xóa có hiệu lực, kho khóa cần được lưu trữ lại, nếu không, các mục sẽ không thực sự được lưu trữ.

Ngoài BKS, BouncyCastle cung cấp thêm hai triển khai kho khóa: BouncyCastlePKCS12.

Keystore.BouncyCastle, hoặc Keystore.UBER sẽ chỉ hoạt động với keytool nếu mật khẩu được cung cấp trên dòng lệnh, vì toàn bộ kho khóa được mã hóa bằng PBE dựa trên SHA1 và Twofish.PBEWithSHAAndTwofish-CBC. Điều này làm cho toàn bộ kho khóa chống lại sự can thiệp và kiểm tra, và buộc phải xác minh. Keytool do Sun JDK cung cấp sẽ cố gắng tải kho khóa ngay cả khi không có mật khẩu nào được đưa ra, điều này là không thể đối với phiên bản này. 

PKCS12 cung cấp một tình huống hơi khác so với kho khóa thông thường, mật khẩu kho khóa hiện là mật khẩu duy nhất được sử dụng để lưu trữ khóa. Nếu không, nó hỗ trợ tất cả các chức năng cần thiết để nó được sử dụng với keytool. Trong một số trường hợp, các thư viện khác luôn mong đợi được xử lý các chứng chỉ Sun, nếu đó là trường hợp, hãy sử dụng PKCS12-DEF, và các chứng chỉ được tạo bởi kho khóa sẽ được tạo bằng nhà cung cấp mặc định. 

JAVA  KEYSTORE  BOUNCYCASTLE  BKS 

       

  RELATED


  0 COMMENT


No comment for this article.



  RANDOM FUN

Why is a senior engineer needed in a team