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オンラインと詳細はこちら
正直なところ、それがこの署名の問題である場合、署名のrとs のパディングを変更する方法がわかりません。誰かがこれについて私を案内してくれることを願っています。どんなアドバイスでも役に立ちます