0

SHA-256withECDSA署名アルゴリズムで CSR を生成しようとしましたが、Bouncy Castle API を使用して検証すると、CSR 内で無効な署名というエラーが発生しました。署名に暗号トークンを使用しています

また、SHA1 などの他の署名アルゴリズムを変更しましたが、それでも無効な署名が得られました。したがって、エラーの疑いはアルゴリズムに関するものではなく、DER のエンコードに関するものです。

これがpkcs10に署名するための私の方法です

public static byte[] GeneratePkcs10(Session session, ObjectHandle privateKeyHandle)
{
    mechanism = new Mechanism(CKM.CKM_ECDSA);
    SignatureAlgorihtm = EcSigOID.SHA256; // OID : 1.2.840.10045.4.3.2
    X9ECParameters x9Ec = ECNamedCurveTable.GetByName("P-256");
    ECDomainParameters domain = new ECDomainParameters(x9Ec.Curve, x9Ec.G, x9Ec.N, x9Ec.H);
    var pubKeyParam = ToPublicKey(PrivKey, domain);

    pkcs10 = new Pkcs10CertificationRequestDelaySigned(SignatureAlgorihtm, new X509Name(subjectDistinguishedName), pubKeyParam, attributes: new DerSet());
    byte[] signature = session.Sign(mechanism, privateKeyHandle, GetMessageDigest(session, pkcs10.GetDataToSign()));

    signature = ConstructEcdsaSigValue(signature);
    pkcs10.SignRequest(new DerBitString(signature));
}

public static bool Verify(byte[] csrSigned)
{
  var csr = new Pkcs10CertificationRequest(csrSigned);
  bool isValid = csr.Verify();
  log.Info("isValid : " + isValid); // FALSE
  return isValid;
}

private static byte[] GetMessageDigest(Session _session, byte[] message)
{
   using (Mechanism mechanism = new Mechanism(CKM.CKM_SHA256))
   {
     return _session.Digest(mechanism, message);
   }
}

public static byte[] ConstructEcdsaSigValue(byte[] rs)
{
  if (rs == null)
    throw new ArgumentNullException(nameof(rs));

  if (rs.Length < 2 || rs.Length % 2 != 0)
    throw new ArgumentException("Invalid length", nameof(rs));

  var derSignature = new DerSequence(
  // first 32 bytes is "r" number
  new DerInteger(new BigInteger(1, rs.Take(32).ToArray())),
  // last 32 bytes is "s" number
  new DerInteger(new BigInteger(1, rs.Skip(32).ToArray()))).GetDerEncoded();

  return derSignature;
}

署名の長さ : 71

r =32 + s =32 の場合、署名は 64バイトになります。追加のバイトは、r または s のパディングでした

出力CSR

-----BEGIN CERTIFICATE REQUEST-----
MIHxMIGZAgEAMDcxDDAKBgNVBAMMA0FCQzEaMBgGA1UECgwRQUJDLmNvbSBTZG4u
IEJoZC4xCzAJBgNVBAYTAk1ZMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyc2h
gzb7gIUwRIym88PxOKTZSiPMOgQjdt0PP9h6kgexOJquZk9duXh0LKXuDI/YaNpb
KxJ91ZGRrdaYbhbvTKAAMAoGCCqGSM49BAMCA0cAMEQCIAaeCoYsDYx1h29GRGKg
XVBB2xXZjsHnr5hZ2iqMgQV2AiB+P7w1Wos8sHRbnyGQW5NCBz+RVrWrWaGa37S9
W0lyBQ==
-----END CERTIFICATE REQUEST-----

CSRオンラインと詳細はこちら

正直なところ、それがこの署名の問題である場合、署名のrs のパディングを変更する方法がわかりません。誰かがこれについて私を案内してくれることを願っています。どんなアドバイスでも役に立ちます

4

0 に答える 0