Java映射,用于使用存储在TrustedCA中的私钥对数据进行签名

2020-08-23 08:10发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我想在ESR中使用Java映射执行签名数据。 如果我用作Java程序,则独立代码可以正常工作,但是当我在ESR中尝试该代码时,我得到了错误的签名。

我不明白如何通过TrustedCA中存储的私钥的路径。

我使用的

代码:-

公共类signData {

public String result ="";

公共字符串signedData(字符串certificateName,字符串certificatePass,字符串数据){

尝试{

byte [] dataByte = data.getBytes();

X509Certificate certificate1 = null; Security.addProvider(new BouncyCastleProvider());

char [] keystorePassword = certificatePass.toCharArray();

char [] keyPassword = certificatePass.toCharArray();

CertificateFactory certFactory = CertificateFactory.getInstance(" X.509"," BC");

KeyStore密钥库= KeyStore.getInstance(" PKCS12");

InitialContext ctx = null;

ctx = new InitialContext();

KeystoreManager管理器= null;

manager =(KeystoreManager)ctx.lookup(" keystore");

keystore = manager.getKeystore(" TrustedCAs");

X509Certificate证书=(X509Certificate)keystore.getCertificate(certificateName);

byte [] certByte = certificate.getEncoded();

InputStream PKstream =新的ByteArrayInputStream(certByte);

keystore.load(PKstream,keystorePassword);

PrivateKey键= null;

KeyManagerFactory kmf = javax.net.ssl.KeyManagerFactory.getInstance(" SunX509");

kmf.init(keystore,keystorePassword);

枚举别名= keystore.aliases();

同时(aliases.hasMoreElements()){

字符串别名= aliases.nextElement();

if(keystore.getCertificate(alias).getType()。equals(" X.509")){

certificate1 =(X509Certificate)keystore.getCertificate(alias);

key =(PrivateKey)keystore.getKey(alias,keyPassword);

}

}

CMSTypedData typedData =新的CMSProcessableByteArray(dataByte);

CMSSignedDataGenerator gen =新的CMSSignedDataGenerator();

ContentSigner签名者=新的JcaContentSignerBuilder(" SHA256withRSA")。setProvider(" BC")。build(key);

JcaSignerInfoGeneratorBuilder构建器=新的JcaSignerInfoGeneratorBuilder(新的JcaDigestCalculatorProviderBuilder()。setProvider(" BC")。build());

gen.addSignerInfoGenerator(builder.build(signer,certificate1));

CMSSignedData已签名= gen.generate(typedData,false);

byte [] der = signed.getEncoded();

字符串符号= Base64.encodeBytes(der);

返回符号;

}

捕获(异常e)

{

return e.getMessage();

}

}

有人可以帮助我吗?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我想在ESR中使用Java映射执行签名数据。 如果我用作Java程序,则独立代码可以正常工作,但是当我在ESR中尝试该代码时,我得到了错误的签名。

我不明白如何通过TrustedCA中存储的私钥的路径。

我使用的

代码:-

公共类signData {

public String result ="";

公共字符串signedData(字符串certificateName,字符串certificatePass,字符串数据){

尝试{

byte [] dataByte = data.getBytes();

X509Certificate certificate1 = null; Security.addProvider(new BouncyCastleProvider());

char [] keystorePassword = certificatePass.toCharArray();

char [] keyPassword = certificatePass.toCharArray();

CertificateFactory certFactory = CertificateFactory.getInstance(" X.509"," BC");

KeyStore密钥库= KeyStore.getInstance(" PKCS12");

InitialContext ctx = null;

ctx = new InitialContext();

KeystoreManager管理器= null;

manager =(KeystoreManager)ctx.lookup(" keystore");

keystore = manager.getKeystore(" TrustedCAs");

X509Certificate证书=(X509Certificate)keystore.getCertificate(certificateName);

byte [] certByte = certificate.getEncoded();

InputStream PKstream =新的ByteArrayInputStream(certByte);

keystore.load(PKstream,keystorePassword);

PrivateKey键= null;

KeyManagerFactory kmf = javax.net.ssl.KeyManagerFactory.getInstance(" SunX509");

kmf.init(keystore,keystorePassword);

枚举别名= keystore.aliases();

同时(aliases.hasMoreElements()){

字符串别名= aliases.nextElement();

if(keystore.getCertificate(alias).getType()。equals(" X.509")){

certificate1 =(X509Certificate)keystore.getCertificate(alias);

key =(PrivateKey)keystore.getKey(alias,keyPassword);

}

}

CMSTypedData typedData =新的CMSProcessableByteArray(dataByte);

CMSSignedDataGenerator gen =新的CMSSignedDataGenerator();

ContentSigner签名者=新的JcaContentSignerBuilder(" SHA256withRSA")。setProvider(" BC")。build(key);

JcaSignerInfoGeneratorBuilder构建器=新的JcaSignerInfoGeneratorBuilder(新的JcaDigestCalculatorProviderBuilder()。setProvider(" BC")。build());

gen.addSignerInfoGenerator(builder.build(signer,certificate1));

CMSSignedData已签名= gen.generate(typedData,false);

byte [] der = signed.getEncoded();

字符串符号= Base64.encodeBytes(der);

返回符号;

}

捕获(异常e)

{

return e.getMessage();

}

}

有人可以帮助我吗?

付费偷看设置
发送
5条回答
SAP砖家
1楼 · 2020-08-23 08:38.采纳回答

Lakshay,

在签名后的代码中,您再次使用base64加密对其进行编码,这可能就是您获得错误签名的原因。 或者,如果该代码不起作用,请转至我在博客中共享的其他代码。

感谢Swapnil

宇峰Kouji
2楼-- · 2020-08-23 08:53

嗨,Swapnil,

谢谢你的建议,它奏效了。 该方案现在可以正常工作,但是存在一个问题,无论我从ESR传递的密码是什么,它都会对数据进行签名,而与检查密码无关。

谢谢

Lakshay。

南山jay
3楼-- · 2020-08-23 08:34

我有一个sap博客,其中包含所有必要的指令以通过Java映射对XML进行签名

https://blogs.sap.com/2020/01/09/sap-pi-po-xml-x509-signature-by-certificate/

哎,真难
4楼-- · 2020-08-23 08:38

我也尝试过,但是有 缺少一些图书馆。

  import com.sap.aii.af.service.resource。*;
 导入com.sap.aii.security.lib。*;  
小灯塔
5楼-- · 2020-08-23 08:41

Hello Lakshay,

我希望该博客可以帮助您解决问题博客,然后也只需博客。 并且如果两者都不起作用,则有大量可用的Java代码可以对您的文件进行签名,这就是博客。 请让我知道它是否有效。

谢谢

Swapnil

一周热门 更多>