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: BouncyCastle và PKCS12.
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.