我手上有个问题。我不懂 Java 的同事正在使用 OpenSSL 命令对文件进行签名,如下所示:
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem \
-inkey passkey.pem -in manifest.json -out signature -outform DER \
-passin pass:12345
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这里有三个文件提供给 openssl 命令来生成签名。
现在我们想使用 Java 复制相同的功能,因为我们假设要签名的内容将是动态的并且本质上是服务器端的。我读到 BouncyCastle 是最佳选择。但我不确定如何使用该库。我对密码技术也不是很熟悉。我无法理解如何使用上面的所有三个文件来签署manifest.json.
如果有人可以引导我找到正确的代码或给我一个开始,我将非常感谢您的努力。
更新:我已经了解了更多有关正在发生的事情并在底部添加了新信息。
我有 2 个应用程序在 tomcat 下运行。首先加载 App1,然后加载 App2。如果 App1 在启动过程中遇到任何类型的错误并且无法成功加载,我会在 App2 启动过程中收到此错误:
Caused by: java.security.NoSuchAlgorithmException: No such algorithm: RSA/NONE/OAEPWithSHA1AndMGF1Padding
at javax.crypto.Cipher.getInstance(DashoA13*..)
at javax.crypto.Cipher.getInstance(DashoA13*..)
at com.jp.protection.security.BouncyCastleSecurityProvider.getCipher(BouncyCastleSecurityProvider.java:139)
at com.jp.protection.security.BouncyCastleSecurityProvider.decode(BouncyCastleSecurityProvider.java:110)
... 70 more
Caused by: java.lang.NullPointerException
at org.bouncycastle.jcajce.provider.util.DigestFactory.getDigest(DigestFactory.java:86)
at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.initFromSpec(CipherSpi.java:83)
at org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineSetPadding(CipherSpi.java:214)
at javax.crypto.Cipher$r.a(DashoA13*..)
... 74 more
Run Code Online (Sandbox Code Playgroud)
请注意,最终原因是 NullPointerException。我下载了 DigestFactory 的源代码,它看起来像这样(只是摘录了相关部分):
package org.bouncycastle.jcajce.provider.util;
public class DigestFactory
{
private static Set sha1 = new HashSet();
static
{
sha1.add("SHA1");
sha1.add("SHA-1");
}
public static Digest getDigest(
String digestName)
{
digestName = Strings.toUpperCase(digestName);
if (sha1.contains(digestName)) ** line …Run Code Online (Sandbox Code Playgroud) 我需要在 Android 应用程序中动态创建 SSL 自签名证书,并能够从同一应用程序中的 https 服务器使用它。我发现这段代码可以创建一个证书,尽管我不确定它是正确的证书类型。我还没有找到太多关于如何将其添加到我的应用程序上的 BouncyCastle 密钥库以及如何在创建 HTTPs 服务器时使用它的信息。有人可以给我指出一个执行此操作的示例吗?谢谢。
static X509Certificate generateSelfSignedX509Certificate() throws Exception {
// yesterday
Date validityBeginDate = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
// in 2 years
Date validityEndDate = new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000);
// GENERATE THE PUBLIC/PRIVATE RSA KEY PAIR
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGenerator.initialize(1024, new SecureRandom());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// GENERATE THE X509 CERTIFICATE
X509V3CertificateGenerator certGen = …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 GnuPG 使用 BouncyCastle C# 库创建的密钥环获取公共 PGP 密钥。我已经使用以下代码使其半工作。问题是它输出的公钥长度大约是真实公钥的一半,而且最后几个字节也不同。我只是想得到真正的钥匙。
更新:值得注意的是,我生成的密钥环只有一个公钥,但我从 bouncycastle 中得到了两个。我还发现,如果将第二个密钥插入到从末尾开始的前几个字符中,它会生成几乎原始的密钥。只有末尾的几个字符不同。那么为什么有两个钥匙,为什么会发生这种情况呢?我缺少什么?
GnuPG 密钥环不兼容吗?
另请注意,此处显示的代码仅获取最后一个密钥。我现在将每个添加到列表中。
这是我的代码:
public static string ReadKey(string pubkeyFile)
{
string theKey;
Stream fs = File.OpenRead(pubkeyFile);
//
// Read the public key rings
//
PgpPublicKeyRingBundle pubRings = new PgpPublicKeyRingBundle(PgpUtilities.GetDecoderStream(fs));
fs.Close();
foreach (PgpPublicKeyRing pgpPub in pubRings.GetKeyRings())
{
pgpPub.GetPublicKey();
foreach (PgpPublicKey pgpKey in pgpPub.GetPublicKeys())
{
//AsymmetricKeyParameter pubKey = pgpKey.GetKey();
//SubjectPublicKeyInfo k = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pubKey);
//byte[] keyData = k.ToAsn1Object().GetDerEncoded();
//byte[] keyData = k.GetEncoded();
byte[] keyData = pgpKey.GetEncoded();
theKey = Convert.ToBase64String(keyData);
}
} …Run Code Online (Sandbox Code Playgroud) 我尝试生成 RSA CA 密钥对和证书并将其保存到密钥库。我的代码是:
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Date;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
private static final String storeType = "PKCS12";
private static final String storePassword = "password";
private static final String storePath = "/usr/lib/java/keystore.ks";
private static final Date startDate = new Date(System.currentTimeMillis()); // time from which certificate is valid
private static final Date expiryDate = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Wildfly Swarm 构建一个现有的 JavaEE 项目,但我的一个库中不断遇到问题。它应该从服务器加载 PEM 格式的公钥并用它来验证签名。然而,我不断得到这个:
2017-06-08 20:55:59,229 ERROR [stderr] (default task-3) java.security.NoSuchProviderException: no such provider: BC
2017-06-08 20:55:59,234 ERROR [stderr] (default task-3) at sun.security.jca.GetInstance.getService(GetInstance.java:83)
2017-06-08 20:55:59,238 ERROR [stderr] (default task-3) at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
2017-06-08 20:55:59,238 ERROR [stderr] (default task-3) at java.security.KeyFactory.getInstance(KeyFactory.java:211)
2017-06-08 20:55:59,239 ERROR [stderr] (default task-3) at enterprises.mccollum.wmapp.ssauthclient.PublicKeySingleton.loadPubKey(PublicKeySingleton.java:83)
2017-06-08 20:55:59,239 ERROR [stderr] (default task-3) at enterprises.mccollum.wmapp.ssauthclient.PublicKeySingleton.init(PublicKeySingleton.java:57)
Run Code Online (Sandbox Code Playgroud)
导致问题的代码在这里:
PublicKeySingleton.java snippet:
81: PemObject pemPubKey = ldPemFromServer();
82: if(pemPubKey != null){
83: KeyFactory kf = KeyFactory.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME);
84: PublicKey lPubKey …Run Code Online (Sandbox Code Playgroud) 我想从给定X509Certificate对象检索 OCSP 信息。由于我不知道如何解析这些信息,所以我在这里问这个问题。
这是我到目前为止得到的:
X509Certificate x509cert = ... //The Certificate
ASN1Primitive obj = ASN1Primitive.fromByteArray(x509cert
.getExtensionValue(Extension.authorityInfoAccess
.getId()));
AuthorityInformationAccess aia = AuthorityInformationAccess.getInstance(obj);
Run Code Online (Sandbox Code Playgroud)
抛出异常:
java.security.cert.CertificateParsingException: java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DEROctetString
Run Code Online (Sandbox Code Playgroud)
如何将 a 解析ASN1Primitive为有效DEROctetString的进度?
ASN1Primitive示例中的值为:
3032303006082b060105050730018624687474703a2f2f6f6373702e616368656c6f732e64653a383038302f6f6373702f65676b
Run Code Online (Sandbox Code Playgroud)
在我看来这是一个有效的值。
我正在尝试使用 pfx/p12 文件获取别名
keytool -v -list -storetype pkcs12 -keystore servercert.p12 -storepass 1234
这给了我
Keystore type: PKCS12
Keystore provider: SunJSSE
Your keystore contains 1 entry
Alias name: 1
Creation date: Jul 4, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=CSIT CA, O="CSIT CA,Ltd.", L=Dhaka, ST=Dhaka, C=BD
Issuer: EMAILADDRESS=csit@csit.com, CN=CSIT CA, OU=Software Department, O=CSIT CA, L=Dhaka, ST=Dhaka, C=BD
Serial number: 1
Valid from: Tue Jul 04 15:41:40 BDT 2017 until: Mon Mar 30 15:41:40 BDT 2020
Certificate fingerprints:
MD5: …Run Code Online (Sandbox Code Playgroud) 从 1.61 版本开始,BouncyCastle 库支持基于 Argon2 密码的密钥派生功能。但是,我找不到如何通过 BouncyCastle API 使用 Argon2 算法的示例。有人可以给个提示吗?多谢。
我们amazon-pay-api-sdk-java-2.2.2.jar在 Adobe ColdFusion中成功地使用了 AmazonPay API for Java ( )。我们最近引入了 Lucee(在 Jetty 上,也在 OpenJDK 8 上运行)并尝试运行相同的代码(相关摘录):
payConfig = createObject("java", "com.amazon.pay.api.PayConfiguration").init();
payConfig.setPrivateKey("...");
Run Code Online (Sandbox Code Playgroud)
但是,在调用 时setPrivateKey,它将到达Security.addProvider(new BouncyCastleProvider());through PayConfiguration,我们收到一个java.lang.ClassNotFoundException:
lucee.runtime.exp.NativeException: org.bouncycastle.jce.provider.BouncyCastleProvider
at com.amazon.pay.api.PayConfiguration.setPrivateKey(PayConfiguration.java:77)
[...]
at java.lang.Thread.run(Thread.java:823)
Caused by: java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider
... 57 more
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider not found by amazon.pay.api.sdk.java.2.2.2 [49]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1597)
at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1982)
at java.lang.ClassLoader.loadClass(ClassLoader.java:881)
... 57 more
Run Code Online (Sandbox Code Playgroud)
我们已将所有依赖项(即bcprov-jdk15on-1.65.jarBouncyCastle)放在/lucee-server/context/lib. BouncyCastleProvider在 .cfm/.cfc 中创建确实按预期工作:
createObject("java", "org.bouncycastle.jce.provider.BouncyCastleProvider").init()
我不明白 Lucee …
bouncycastle ×10
java ×7
cryptography ×2
android ×1
apache-felix ×1
argon2-ffi ×1
c# ×1
ca ×1
coldfusion ×1
encryption ×1
keystore ×1
lucee ×1
maven ×1
openpgp ×1
passwords ×1
pgp ×1
ssl ×1
tomcat ×1