ecdsa は ECDSA と EdDSA を純粋な Python で実装しており、内部で OpenSSL を使いません。そのためどこにでも簡単にインストールでき、テストベクトルの作成や教育用途に便利です。また、python-jose のような古い JOSE スタックの依存関係として今も使われています。メンテナーはサイドチャネル攻撃への耐性を考慮した設計ではないと明言しているため、本番環境での署名には pyca/cryptography か coincurve を使うべきです。
相互運用の失敗は、ほぼすべてが 3 つのデフォルト値に起因します。まず、ハッシュのデフォルトは SHA-1 です。hashfunc を指定せずに作成した SigningKey は SHA-1 のダイジェストに署名します。チェックではデフォルトの署名を pyca/cryptography で検証してこれを確認しました。SHA-1 では検証を通り、SHA-256 では失敗しました。次に、署名は DER ではなく生の r‖s(P-256 では 64 バイト)です。そして VerifyingKey.to_string() は 0x04 のプレフィックスがない 64 バイトの x‖y を返しますが、OpenSSL、Go、WebCrypto はこれを点として読み取りません。
署名には、sign_deterministic() を呼ばない限りランダムな nonce が使われます。この関数は RFC 6979 の P-256 テストベクトルを再現しました。*_canonize 系のエンコーダーを選ばない限り s は計算されたまま残り(約半数は high-S です)、検証は low-S と high-S のどちらも受け入れます。エンコーディングはすべて呼び出しごとに sigencode= と sigdecode= で選ぶため、署名側と検証側は同じ組み合わせを指定しなければなりません。DER 署名をデフォルトの生形式用デコーダーに渡すと BadSignatureError: Malformed formatting of signature が発生します。
対応する曲線は Python ライブラリの中で最も幅広く、P-224〜P-521、secp256k1、Brainpool に加えて Ed25519 と Ed448 も使えます。鍵は SPKI の PEM または DER、SEC1 の点、生のスカラーとして読み込めます。to_pem() は、format="pkcs8" を渡さない限り SEC1 の EC PRIVATE KEY を書き出します。
サンプルでは 3 つのデフォルトをまとめて修正しています。SHA-256、決定的 nonce、正規化された low-S の DER 署名です。生成した署名を別のライブラリと突き合わせるには、DER ⇄ 生形式の変換ツールとテストベクトルを使うのが最も手早い方法です。