From b095e7aa6ca8226bc920a092b842196eadeb91e0 Mon Sep 17 00:00:00 2001 From: Image Date: Thu, 25 Dec 2025 15:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(git=5Fssh=5Fservice)=EF=BC=9A?= =?UTF-8?q?=E6=89=A9=E5=B1=95SSH=E7=A7=81=E9=92=A5=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=E4=BC=A0=E7=BB=9FRSA=20PEM=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=20=F0=9F=94=A7=20refactor(git=5Fssh=5Fservice)?= =?UTF-8?q?=EF=BC=9A=E9=87=8D=E6=9E=84=E7=A7=81=E9=92=A5=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/services/git_ssh_service.py | 38 +++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/backend/app/services/git_ssh_service.py b/backend/app/services/git_ssh_service.py index 3df1d57..99c542a 100644 --- a/backend/app/services/git_ssh_service.py +++ b/backend/app/services/git_ssh_service.py @@ -94,22 +94,44 @@ class SSHKeyService: 验证私钥和公钥是否匹配 Args: - private_key: SSH私钥(OpenSSH格式) + private_key: SSH私钥(支持传统RSA PEM格式或OpenSSH格式) public_key: SSH公钥(OpenSSH格式) Returns: 是否匹配 """ try: - from cryptography.hazmat.primitives.serialization import load_ssh_private_key + from cryptography.hazmat.primitives.serialization import ( + load_ssh_private_key, + load_pem_private_key + ) from cryptography.hazmat.backends import default_backend - # 加载私钥 - private_key_obj = load_ssh_private_key( - private_key.encode('utf-8'), - password=None, - backend=default_backend() - ) + # 尝试加载私钥(支持多种格式) + private_key_bytes = private_key.encode('utf-8') + private_key_obj = None + + # 首先尝试作为OpenSSH格式加载 + try: + private_key_obj = load_ssh_private_key( + private_key_bytes, + password=None, + backend=default_backend() + ) + except Exception: + # 如果失败,尝试作为传统PEM格式加载(支持RSA、DSA、EC等) + try: + private_key_obj = load_pem_private_key( + private_key_bytes, + password=None, + backend=default_backend() + ) + except Exception as e: + print(f"[SSH] Failed to load private key: {e}") + return False + + if not private_key_obj: + return False # 从私钥导出公钥 derived_public_key = private_key_obj.public_key()