9

ドキュメント管理システムを作成し、Webクライアントを使用してドキュメントにデジタル署名したいと考えています。私たちのJavaクライアントアプリケーションはすでにデジタル署名を適用してチェックすることができますが、私たちのWebクライアントでも署名を作成したいと思います。これはGWTで記述されているため、クライアント側で実行するとJavaScriptアプリケーションになります。

Javaアプレットを作成し、それをクライアントにダウンロードして実行する必要はありません。ドキュメントに署名するために、ブラウザセキュリティデバイスまたはブラウザAPIを使用したいと思います。また、完全なドキュメントサーバー側を維持し、ドキュメントハッシュのみをクライアントに移動したいと思います。

これはNSS またはnpapi/npruntimeを使用して可能であると思われますが、これに関する情報は見つかりませんでした。(ちなみに、npruntimeはIEでも利用できますか?IEで同じ結果を達成するためにActiveXを使用する必要がありますか?)

ヒントはありますか?

4

5 に答える 5

9

もう少しグーグルした後、私は答えを見つけました。Mozillaは、 window.cryptoオブジェクトを介してNSSモジュールの一部をエクスポートします。このような操作を行うためのより標準的な方法は、おそらくDOMCryptを使用することです。これは、現在W3Cで説明されています。Google Chrome開発者はW3CがDOMCryptを標準化するのを待ちますが、Microsoftはここで説明されているようにActiveXオブジェクトの使用を要求します(これはWindows上のFirefox / Chrome / Operaでも機能します)。

于 2012-05-12T05:27:54.673 に答える
5

現在(2016年5月)はできません。

ChromeはJavaのサポートを終了しました。「WindowsEdge」にはありません。IE11のサポートは不良であり、OracleはJavaプラグインを廃止することを決定しました。これは、Firefox、古いバージョンのIE、およびJavaプラグインでのみ可能です。

新しいWebCryptographyApi標準は、ブラウザーのデジタル署名サポートを提供しますが、pcks#11サポートはありません。

これを解決するための実際の電子政府ソリューション:1)ユーザーのPCにローカルJavaアプリケーションをインストールします。アプリケーションは、たとえば5678のようにポートでリッスンします。2)ページで、javascriptはアプレットのサポートがあるかどうかを検出します。3)サポートがない場合は、http://127.0.01:5678/の形式でアプリケーションに接続します。署名し、署名するデータを送信します。4)アプリケーションはローカルであり、ドライバーPKCS#11を含むオペレーティングシステムキーストアを使用しても問題ありません。デジタル署名を作成して結果を準備します。5)ページjavascriptは定期的に結果をクエリし、準備ができたら取得します。

于 2016-05-24T18:23:32.240 に答える
0

Win / IEでは、サードパーティのActiveXまたは外部ライブラリがなくてもCAPICOMhttp ://en.wikipedia.org/wiki/CAPICOMを使用できます。
これは、IEがインストールされている場所ならどこでも機能します。
ただし、これは廃止されます。

以下は、IEにサインインするために使用しているものです。私はこれを例えば: var signature = signDigest(stringToBeSigned);

function signDigest(text) {
if (window.event)
    window.event.cancelBubble = true;

var dest = sign(text); //TODO  

return dest;
}

// CAPICOM constants  

var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;
var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_E_CANCELLED = -2138568446;
var CERT_KEY_SPEC_PROP_ID = 6;

function IsCAPICOMInstalled() {
    if (typeof (oCAPICOM) == "object") {
        if ((oCAPICOM.object != null)) {
            // We found CAPICOM!  
            return true;
        }
    }
}

function FindCertificateByHash() {

    try {
        // instantiate the CAPICOM objects  
        var MyStore = new ActiveXObject("CAPICOM.Store");
        // open the current users personal certificate store  
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);

        // find all of the certificates that have the specified hash  
        var FilteredCertificates = MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, strUserCertigicateThumbprint);

        var Signer = new ActiveXObject("CAPICOM.Signer");
        Signer.Certificate = FilteredCertificates.Item(1);
        return Signer;

        // Clean Up  
        MyStore = null;
        FilteredCertificates = null;
    }
    catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            return new ActiveXObject("CAPICOM.Signer");
        }
    }
}

function sign(src) {
    if (window.crypto && window.crypto.signText)
        return sign_NS(src);
    else

        return sign_IE(src);
}

function sign_NS(src) {
    var s = crypto.signText(src, "ask");
    return s;
}

function sign_IE(src) {
    try {
        // instantiate the CAPICOM objects  
        var SignedData = new ActiveXObject("CAPICOM.SignedData");
        var TimeAttribute = new ActiveXObject("CAPICOM.Attribute");

        // Set the data that we want to sign  
        SignedData.Content = src;
        var Signer = FindCertificateByHash();


        // Set the time in which we are applying the signature  
        var Today = new Date();
        TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
        TimeAttribute.Value = Today.getVarDate();
        Today = null;
        Signer.AuthenticatedAttributes.Add(TimeAttribute);

        // Do the Sign operation  
        var szSignature = SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
        return szSignature;
    }
    catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("An error occurred when attempting to sign the content, the error was: " + e.description);
        }
    }
    return "";
}  

エンコーディングなどに問題があったので、コントローラー(.net)も含めました

        byte[] decbuff = Convert.FromBase64String(signature);


    //CAPICOM USES 16 BIT ENCODING
    Encoding utf16Enc = Encoding.GetEncoding("UTF-16LE");


    byte[] utf16Data = utf16Enc.GetBytes(getContent);


    ContentInfo content = new ContentInfo(utf16Data);

    System.Security.Cryptography.Pkcs.SignedCms cms = new System.Security.Cryptography.Pkcs.SignedCms(content,true);
    cms.Decode(decbuff);

    int length = decbuff.Length;         

    X509Certificate2 cert = cms.SignerInfos[0].Certificate;


    X509Chain chain = new X509Chain();
    bool theVal = chain.Build(cert);
    cms.CheckHash();       
    cms.CheckSignature(false);
于 2013-07-01T16:26:02.710 に答える
0

私が関わった1つのプロジェクトは、Chromeとネイティブメッセージングでこれを行いました。

https://github.com/CACBridge/ChromeCAC

これにはchromeプラグインのインストールが必要ですが、それ以外の場合はうまく機能します。たとえば、事前にこれを行う必要があることがわかっているイントラネット/グループ環境に最適です。

于 2016-11-07T17:06:19.803 に答える
-1

今、あなたはそれを行うことができます。PKCS#11スマートカードまたはトークンに基づくWebアプリケーションは、NCryptokiのSilverlightバージョンを使用して実装できます。http://www.ncryptoki.comを参照してください

2つのチャンチがあります:

1)NCryptokiのSilverlightバージョンを使用し、スマートカードが提供するPKCS#11関数を使用して、ロジック(場合によってはデジタル署名)を実装する独自のSilverlightユーザーコントロールを開発します。

2)上記のSilverlightバージョンに基づくJQueryプラグインを使用し、JavaScriptでPKCS#11関数を呼び出してアプリケーションをJavaScriptで実装します

また、必要なすべてを実行し、任意のWebブラウザーに実装できるSilverlightバージョンのNDigitSign(http://www.ncryptoki.comを再度参照)を使用できます。

于 2013-10-19T15:17:40.400 に答える