Во всяком случае, чтобы интегрировать с AWS классическим CloudHSM вместо Java-кода - PullRequest
0 голосов
/ 28 января 2019

Мое приложение работает в приложении на 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();
}

}

...