2016-05-31 9 views
0

LinuxクライアントとWindowsクライアントでデジタル署名が異なるという奇妙な問題に直面しています。エンコーディングが異なる場合にこれが発生する可能性があるので、すべてのコードをUTF-8に変更しました。また、ハードコードされた文字列を追加して、シグネチャが異なるかどうかを確認しました。Java:Windowsクライアントとは異なるデジタル署名

これは文字列である:

"http%3a%2f%2fschemas.xmlsoap.org" 

ローカル署名である:

23d8190409b19fcfb83586b317de8ef710bd485ab5277238f2f2d3fa5daa3660 

サーバ列がある:ここ

7bacef6d25665ae8df11f736b2612c8ebc92a160ee4ced4606c07e7a93a50338 

は、署名コードである:

private String sign(String data) throws Exception { 

    InputStream input = getClass().getResourceAsStream(
      securityWebApi.getSecurityFilterConfiguration().getAzureSignatureKey()); 

    Reader reader = new InputStreamReader(input, "UTF-8"); 

    byte[] key = IOUtils.toByteArray(reader, Charset.forName("UTF-8")); 

    LOG.debug("got key array : " + new String(key)); 

    Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); 
    SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256"); 
    sha256_HMAC.init(secret_key); 

    String testSign = Hex 
      .encodeHexString(sha256_HMAC.doFinal("http%3a%2f%2fschemas.xmlsoap.org".getBytes("UTF-8"))); 

    LOG.debug("test sign == " + testSign); 

    String testSign2 = "Bla" 
       +"bla"; 

    LOG.debug("test sign2== " + Hex 
      .encodeHexString(sha256_HMAC.doFinal(testSign2.getBytes("UTF-8")))); 

    return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8"))); 
} 

したがって、すべての署名が異なります。どうやら私はここに何か根本的なものを見逃しているのですが、何ですか? ご協力いただきありがとうございます。

はい、サーバーコードはOracle Weblogic 11gで実行されています。

もちろん、秘密鍵が等しいかどうかを再確認します。

+0

秘密鍵も添付できますか? (mijnnuonapi.key私は思います)。可能であれば、テストサインとテストサイン2の予想結果を指定できますか? – Aris2World

+0

こんにちは、あなたはクライアントとサーバー上のtestSingの結果を見ることができます。私はここでAPIキーを印刷することはできません。 –

+0

「取得されたキー配列:」をログに記録すると、クライアントログとサーバーログを同じ値で比較できますか? – Aris2World

答えて

0

問題は、キーファイルがLFのみでLinuxで読み取られたことでした。署名の検証はWindows Server上で行われました。同じキーファイルがCRLFで読み込まれていたので、これはDIFFERENTキー(バイト配列)です。

Windowsでの署名の検証によってCR文字がキー文字列から削除されるようにコードを変更しました。