Мое приложение работает в приложении на C # и интегрируется с классическим HSM aws через Safenet и LunaAPI.Цель состоит в том, чтобы извлечь закрытый ключ из HSM и подписать его в pdf-документе с помощью itextsharp.
Из-за громоздкой интеграции с HSM в то время мы выбрали Java для этой части и создали модуль .jar, который будетвызываться внутри приложения C #.Теперь он показывает некоторые узкие места, и я бы предпочел переместить их все в код на C #, чтобы им было легче управлять и разрабатывать.Я был исследован и нашел какой-то открытый исходный код, например PKCS11Interop, но я не нахожу никакой подсказки для начала.
открытый класс LunaClient расширяет CertificateProvider {частная статическая LunaSlotManager sm = null;
public LunaClient(){}
private void loginHSM() throws Exception {
// Login to HSM
sm = LunaSlotManager.getInstance();
// Login to slot #1
sm.login(1, Property.Luna.CloudHSMPwd);
}
@Override
public Certificate[] getCertificates() throws Exception {
LunaCertificateX509[] CertChain = new LunaCertificateX509[3];
loginHSM();
// get LunaCertificateX509
CertChain[0] = LunaCertificateX509.LocateCertByAlias(Property.Luna.DigicertAlias0);
CertChain[1] = LunaCertificateX509.LocateCertByAlias(Property.Luna.DigicertAlias1);
CertChain[2] = LunaCertificateX509.LocateCertByAlias(Property.Luna.DigicertAlias2);
// return LunaCertificateX509
return (Certificate[])CertChain;
}
@Override
public PrivateKey getPrivateKey() throws Exception {
loginHSM();
// Dynamically load security providers
Class<?> providerClass = Class.forName("com.safenetinc.luna.provider.LunaProvider");
java.security.Provider provider = (java.security.Provider) providerClass.newInstance();
java.security.Security.removeProvider(provider.getName());
java.security.Security.insertProviderAt(provider, 2);
providerClass = Class.forName("com.safenetinc.luna.provider.LunaProvider");
provider = (java.security.Provider) providerClass.newInstance();
java.security.Security.removeProvider(provider.getName());
java.security.Security.insertProviderAt(provider, 3);
// This syntax gets an instance of a LunaKeystore
KeyStore ks = KeyStore.getInstance("Luna");
ks.load(null, null);
providerName = provider.getName();
return (PrivateKey) ks.getKey(Property.Luna.DigicertPrivateKeyalias, Property.Luna.CloudHSMPwd.toCharArray());
}
@Override
public void close() {
sm.logout();
}
}