Openssl google cloud kms PKCS7加密消息语法
有没有人使用谷歌的HSM和KMS服务实现加密消息语法 很难判断此功能是否内置于库中 没有针对OpenSSL或BoringSSL的Google引擎(如果不是这样的话,希望得到更正),而且由于该引擎需要用clang编写,我想很难包含tink.so库Openssl google cloud kms PKCS7加密消息语法,openssl,google-cloud-kms,tink,Openssl,Google Cloud Kms,Tink,有没有人使用谷歌的HSM和KMS服务实现加密消息语法 很难判断此功能是否内置于库中 没有针对OpenSSL或BoringSSL的Google引擎(如果不是这样的话,希望得到更正),而且由于该引擎需要用clang编写,我想很难包含tink.so库 如果任何人有任何关于在谷歌KMS服务上执行此类操作的信息,将不胜感激 目前,这需要相当数量的自定义代码,尽管在技术上是可能的。Tink中没有内置此功能,也没有可用于OpenSSL或BoringSSL的云KMS引擎 也许最简单的方法是在Bouncycast
如果任何人有任何关于在谷歌KMS服务上执行此类操作的信息,将不胜感激 目前,这需要相当数量的自定义代码,尽管在技术上是可能的。Tink中没有内置此功能,也没有可用于OpenSSL或BoringSSL的云KMS引擎
也许最简单的方法是在Bouncycastle中使用带有CMS支持的Cloud KMS Java客户端,尽管我不确定Java是否适合您的用例。如果您认为它有用的话,我可以写一个示例来说明如何做到这一点。目前,这需要大量的自定义代码,尽管技术上是可行的。Tink中没有内置此功能,也没有可用于OpenSSL或BoringSSL的云KMS引擎 也许最简单的方法是在Bouncycastle中使用带有CMS支持的Cloud KMS Java客户端,尽管我不确定Java是否适合您的用例。如果你觉得有用的话,我可以写一个如何做的示例。谢谢@bdhess的指导! 我为那些有兴趣尝试类似功能的人提供了一些代码片段。需要注意的主要类是
ContentSignerFactory.java
,这就是API神奇之处
bouncycastle有一个非常有用的pdf:
注意:我不是java程序员
Cms.java
public class Cms {
public static byte[] signDataKms(
String credentialsKeyPath,
String keyName,
X509Certificate signingCert,
byte data[]) throws Exception {
List<X509Certificate> certList = new ArrayList<>();
certList.add(signingCert);
Store certs = new JcaCertStore(certList);
CMSTypedData cmsData = new CMSProcessableByteArray(data);
DigestCalculatorProvider digProvider =
new JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
JcaSignerInfoGeneratorBuilder signerInfoGeneratorBuilder =
new JcaSignerInfoGeneratorBuilder(digProvider);
//SignedHash is a base64-encoded PKCS1 block.
ContentSigner sha1Signer = ContentSignerFactory.getContentSigner((stream) -> {
try {
return Kms.signAsymmetric(credentialsKeyPath, keyName, stream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[0];
}, "SHA256WITHRSA");
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSignerInfoGenerator(signerInfoGeneratorBuilder.build(sha1Signer, signingCert));
gen.addCertificates(certs);
CMSSignedData cms = gen.generate(cmsData, true);
return cms.toASN1Structure().getEncoded(ASN1Encoding.DER);
}
}
public class ContentSignerFactory {
public static ContentSigner getContentSigner(Function<ByteArrayOutputStream, byte[]> lambda, String algorithm) {
return new ContentSigner() {
//This is to ensure that signature is created using the right data.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
@Override
public byte[] getSignature() {
//Calling HSM here instead, the stream is the AttributeMap
byte[] data = lambda.apply(stream);
return data;
}
//Perhaps called by BouncyCastle library to provide the content
@Override
public OutputStream getOutputStream() {
return stream;
}
@Override
public AlgorithmIdentifier getAlgorithmIdentifier() {
return new DefaultSignatureAlgorithmIdentifierFinder().find(algorithm);
}
};
}
}
public class Kms {
public static byte[] signAsymmetric(String credentialsKeyPath, String keyName, byte[] message)
throws IOException, NoSuchAlgorithmException {
// Create the Cloud KMS client.
try (KeyManagementServiceClient client
= KeyManagementServiceClient.create(getKeyManagementServiceSettings(credentialsKeyPath))) {
// Note: some key algorithms will require a different hash function
// For example, EC_SIGN_P384_SHA384 requires SHA-384
byte[] messageHash = MessageDigest.getInstance("SHA-256").digest(message);
AsymmetricSignRequest request = AsymmetricSignRequest.newBuilder()
.setName(keyName)
.setDigest(Digest.newBuilder().setSha256(ByteString.copyFrom(messageHash)))
.build();
AsymmetricSignResponse response = client.asymmetricSign(request);
return response.getSignature().toByteArray();
}
}
}
Kms.java
public class Cms {
public static byte[] signDataKms(
String credentialsKeyPath,
String keyName,
X509Certificate signingCert,
byte data[]) throws Exception {
List<X509Certificate> certList = new ArrayList<>();
certList.add(signingCert);
Store certs = new JcaCertStore(certList);
CMSTypedData cmsData = new CMSProcessableByteArray(data);
DigestCalculatorProvider digProvider =
new JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
JcaSignerInfoGeneratorBuilder signerInfoGeneratorBuilder =
new JcaSignerInfoGeneratorBuilder(digProvider);
//SignedHash is a base64-encoded PKCS1 block.
ContentSigner sha1Signer = ContentSignerFactory.getContentSigner((stream) -> {
try {
return Kms.signAsymmetric(credentialsKeyPath, keyName, stream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[0];
}, "SHA256WITHRSA");
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSignerInfoGenerator(signerInfoGeneratorBuilder.build(sha1Signer, signingCert));
gen.addCertificates(certs);
CMSSignedData cms = gen.generate(cmsData, true);
return cms.toASN1Structure().getEncoded(ASN1Encoding.DER);
}
}
public class ContentSignerFactory {
public static ContentSigner getContentSigner(Function<ByteArrayOutputStream, byte[]> lambda, String algorithm) {
return new ContentSigner() {
//This is to ensure that signature is created using the right data.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
@Override
public byte[] getSignature() {
//Calling HSM here instead, the stream is the AttributeMap
byte[] data = lambda.apply(stream);
return data;
}
//Perhaps called by BouncyCastle library to provide the content
@Override
public OutputStream getOutputStream() {
return stream;
}
@Override
public AlgorithmIdentifier getAlgorithmIdentifier() {
return new DefaultSignatureAlgorithmIdentifierFinder().find(algorithm);
}
};
}
}
public class Kms {
public static byte[] signAsymmetric(String credentialsKeyPath, String keyName, byte[] message)
throws IOException, NoSuchAlgorithmException {
// Create the Cloud KMS client.
try (KeyManagementServiceClient client
= KeyManagementServiceClient.create(getKeyManagementServiceSettings(credentialsKeyPath))) {
// Note: some key algorithms will require a different hash function
// For example, EC_SIGN_P384_SHA384 requires SHA-384
byte[] messageHash = MessageDigest.getInstance("SHA-256").digest(message);
AsymmetricSignRequest request = AsymmetricSignRequest.newBuilder()
.setName(keyName)
.setDigest(Digest.newBuilder().setSha256(ByteString.copyFrom(messageHash)))
.build();
AsymmetricSignResponse response = client.asymmetricSign(request);
return response.getSignature().toByteArray();
}
}
}
感谢@bdhess的指导!
我为那些有兴趣尝试类似功能的人提供了一些代码片段。需要注意的主要类是ContentSignerFactory.java
,这就是API神奇之处
bouncycastle有一个非常有用的pdf:
注意:我不是java程序员
Cms.java
public class Cms {
public static byte[] signDataKms(
String credentialsKeyPath,
String keyName,
X509Certificate signingCert,
byte data[]) throws Exception {
List<X509Certificate> certList = new ArrayList<>();
certList.add(signingCert);
Store certs = new JcaCertStore(certList);
CMSTypedData cmsData = new CMSProcessableByteArray(data);
DigestCalculatorProvider digProvider =
new JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
JcaSignerInfoGeneratorBuilder signerInfoGeneratorBuilder =
new JcaSignerInfoGeneratorBuilder(digProvider);
//SignedHash is a base64-encoded PKCS1 block.
ContentSigner sha1Signer = ContentSignerFactory.getContentSigner((stream) -> {
try {
return Kms.signAsymmetric(credentialsKeyPath, keyName, stream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[0];
}, "SHA256WITHRSA");
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSignerInfoGenerator(signerInfoGeneratorBuilder.build(sha1Signer, signingCert));
gen.addCertificates(certs);
CMSSignedData cms = gen.generate(cmsData, true);
return cms.toASN1Structure().getEncoded(ASN1Encoding.DER);
}
}
public class ContentSignerFactory {
public static ContentSigner getContentSigner(Function<ByteArrayOutputStream, byte[]> lambda, String algorithm) {
return new ContentSigner() {
//This is to ensure that signature is created using the right data.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
@Override
public byte[] getSignature() {
//Calling HSM here instead, the stream is the AttributeMap
byte[] data = lambda.apply(stream);
return data;
}
//Perhaps called by BouncyCastle library to provide the content
@Override
public OutputStream getOutputStream() {
return stream;
}
@Override
public AlgorithmIdentifier getAlgorithmIdentifier() {
return new DefaultSignatureAlgorithmIdentifierFinder().find(algorithm);
}
};
}
}
public class Kms {
public static byte[] signAsymmetric(String credentialsKeyPath, String keyName, byte[] message)
throws IOException, NoSuchAlgorithmException {
// Create the Cloud KMS client.
try (KeyManagementServiceClient client
= KeyManagementServiceClient.create(getKeyManagementServiceSettings(credentialsKeyPath))) {
// Note: some key algorithms will require a different hash function
// For example, EC_SIGN_P384_SHA384 requires SHA-384
byte[] messageHash = MessageDigest.getInstance("SHA-256").digest(message);
AsymmetricSignRequest request = AsymmetricSignRequest.newBuilder()
.setName(keyName)
.setDigest(Digest.newBuilder().setSha256(ByteString.copyFrom(messageHash)))
.build();
AsymmetricSignResponse response = client.asymmetricSign(request);
return response.getSignature().toByteArray();
}
}
}
Kms.java
public class Cms {
public static byte[] signDataKms(
String credentialsKeyPath,
String keyName,
X509Certificate signingCert,
byte data[]) throws Exception {
List<X509Certificate> certList = new ArrayList<>();
certList.add(signingCert);
Store certs = new JcaCertStore(certList);
CMSTypedData cmsData = new CMSProcessableByteArray(data);
DigestCalculatorProvider digProvider =
new JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
JcaSignerInfoGeneratorBuilder signerInfoGeneratorBuilder =
new JcaSignerInfoGeneratorBuilder(digProvider);
//SignedHash is a base64-encoded PKCS1 block.
ContentSigner sha1Signer = ContentSignerFactory.getContentSigner((stream) -> {
try {
return Kms.signAsymmetric(credentialsKeyPath, keyName, stream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[0];
}, "SHA256WITHRSA");
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSignerInfoGenerator(signerInfoGeneratorBuilder.build(sha1Signer, signingCert));
gen.addCertificates(certs);
CMSSignedData cms = gen.generate(cmsData, true);
return cms.toASN1Structure().getEncoded(ASN1Encoding.DER);
}
}
public class ContentSignerFactory {
public static ContentSigner getContentSigner(Function<ByteArrayOutputStream, byte[]> lambda, String algorithm) {
return new ContentSigner() {
//This is to ensure that signature is created using the right data.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
@Override
public byte[] getSignature() {
//Calling HSM here instead, the stream is the AttributeMap
byte[] data = lambda.apply(stream);
return data;
}
//Perhaps called by BouncyCastle library to provide the content
@Override
public OutputStream getOutputStream() {
return stream;
}
@Override
public AlgorithmIdentifier getAlgorithmIdentifier() {
return new DefaultSignatureAlgorithmIdentifierFinder().find(algorithm);
}
};
}
}
public class Kms {
public static byte[] signAsymmetric(String credentialsKeyPath, String keyName, byte[] message)
throws IOException, NoSuchAlgorithmException {
// Create the Cloud KMS client.
try (KeyManagementServiceClient client
= KeyManagementServiceClient.create(getKeyManagementServiceSettings(credentialsKeyPath))) {
// Note: some key algorithms will require a different hash function
// For example, EC_SIGN_P384_SHA384 requires SHA-384
byte[] messageHash = MessageDigest.getInstance("SHA-256").digest(message);
AsymmetricSignRequest request = AsymmetricSignRequest.newBuilder()
.setName(keyName)
.setDigest(Digest.newBuilder().setSha256(ByteString.copyFrom(messageHash)))
.build();
AsymmetricSignResponse response = client.asymmetricSign(request);
return response.getSignature().toByteArray();
}
}
}
谢谢你!非常感谢。我将发布探索的结果!谢谢@bdhess。我已经为那些感兴趣的人发布了一些代码片段。发展愉快!谢谢你!非常感谢。我将发布探索的结果!谢谢@bdhess。我已经为那些感兴趣的人发布了一些代码片段。发展愉快!