1

この投稿を読んで、C# で BouncyCastle dll を使用してファイルに署名する方法を読み ました。スマートカードに保存されている証明書のサポートが見つかる可能性があるかどうかを知りたいです。

私がやろうとしているのは、P7M ケードを作成することですが、ドキュメント、.NET クラス、または無料のライブラリを見つけることは不可能のようです。

4

3 に答える 3

4

また、欧州委員会イニシアチブの次の c# 移植バージョンを試すこともできます。

DSS.NET

CAdESに対応しています。MSCAPISignatureToken とクックブックのガイドを使用してみてください

クックブック

于 2014-06-09T05:25:25.843 に答える
2

このコードで DSS.NET を使用しました。

using System.Security.Cryptography.X509Certificates;
using EU.Europa.EC.Markt.Dss;
using EU.Europa.EC.Markt.Dss.Signature;
using EU.Europa.EC.Markt.Dss.Signature.Cades;
using EU.Europa.EC.Markt.Dss.Signature.Token;

   private static void SignP7M(X509Certificate2 card, string sourcepath)
            {
                var service = new CAdESService();

                // Creation of MS CAPI signature token
                var token = new MSCAPISignatureToken { Cert = card };

                var parameters = new SignatureParameters
                {
                    SignatureAlgorithm = SignatureAlgorithm.RSA,
                    SignatureFormat = SignatureFormat.CAdES_BES,
                    DigestAlgorithm = DigestAlgorithm.SHA256,
                    SignaturePackaging = SignaturePackaging.ENVELOPING,
                    SigningCertificate = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(token.Cert),
                    SigningDate = DateTime.UtcNow
                };

                var toBeSigned = new FileDocument(sourcepath);

                var iStream = service.ToBeSigned(toBeSigned, parameters);

                var signatureValue = token.Sign(iStream, parameters.DigestAlgorithm, token.GetKeys()[0]);

                var signedDocument = service.SignDocument(toBeSigned, parameters, signatureValue);

                var dest = sourcepath + ".p7m";
                if (File.Exists(dest)) File.Delete(dest);
                var fout = File.OpenWrite(dest);
                signedDocument.OpenStream().CopyTo(fout);
                fout.Close();
            }

カードは次の 2 つの方法で入手できます。

  • 証明書ストアから
  • 証明書のシリアル番号から

ここにサンプル:

public static X509Certificate2 GetCertificate(string _certSn)
        {
            //selezione del token di firma

            var st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            st.Open(OpenFlags.ReadOnly);
            var col = st.Certificates;
            var card = col.Cast<X509Certificate2>().FirstOrDefault(t => t.SerialNumber == _certSn);

            st.Close();

            return card;
        }


public static X509Certificate2 selectCert(StoreName store, StoreLocation location, string windowTitle, string windowMsg)
{

    X509Certificate2 certSelected = null;
    X509Store x509Store = new X509Store(store, location);
    x509Store.Open(OpenFlags.ReadOnly);

    X509Certificate2Collection col = x509Store.Certificates;
    X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, windowTitle, windowMsg, X509SelectionFlag.SingleSelection);

    if (sel.Count > 0)
    {
        X509Certificate2Enumerator en = sel.GetEnumerator();
        en.MoveNext();
        certSelected = en.Current;
    }

    x509Store.Close();

    return certSelected;
}
于 2015-08-21T09:40:09.387 に答える
-1

スマート カードが Windows 証明書ストレージにマップされている場合は、CryptoAPI 経由で利用可能な証明書を使用できます。スマートカードが PKCS#11 経由で利用可能な場合は、SecureBlackbox 製品のPKIBlackboxパッケージを使用して使用できます。また、PKIBlackbox は PKCS#7/CMS だけでなく、CAdES 形式も​​サポートしています。

于 2013-07-17T17:09:59.730 に答える