باستخدام Git ، هل هناك طريقة لإخباره بقبول شهادة موقعة ذاتياً؟
أنا أستخدم خادم https لاستضافة خادم git ، لكن الشهادة موقعة ذاتيًا في الوقت الحالي.
عندما أحاول إنشاء الريبو هناك لأول مرة:
git Push Origin master -f
لقد حصلت على الخطأ:
error: Cannot access URL
https://the server/git.aspx/PocketReferences/, return code 22
fatal: git-http-Push failed
جرب http.sslCAPath
أو http.sslCAInfo
. (إجابة آدم سبيرز تعطي بعض الأمثلة الرائعة. هذا هو الحل الأكثر أمانا لهذا السؤال.
حاول تمرير -c
إلى git
مع متغير التكوين الصحيح ، أو استخدم إجابة التدفق :
git -c http.sslVerify=false clone https://example.com/path/to/git
إذا كان المستودع تحت سيطرتك تمامًا ، فيمكنك محاولة:
git config http.sslVerify false
يعد تعطيل التحقق من شهادة TLS (/ SSL) عالميًا ممارسة غير آمنة بشكل كبير. لا تفعل ذلك. لا تصدر الأمر أعلاه مع معدل --global
.
هناك عدد غير قليل من خيارات تكوين SSL في git
. من الصفحة الرئيسية لـ git config
:
http.sslVerify
Whether to verify the SSL certificate when fetching or pushing over HTTPS.
Can be overridden by the GIT_SSL_NO_VERIFY environment variable.
http.sslCAInfo
File containing the certificates to verify the peer with when fetching or pushing
over HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.
http.sslCAPath
Path containing files with the CA certificates to verify the peer with when
fetching or pushing over HTTPS.
Can be overridden by the GIT_SSL_CAPATH environment variable.
بعض خيارات تكوين SSL المفيدة الأخرى:
http.sslCert
File containing the SSL certificate when fetching or pushing over HTTPS.
Can be overridden by the GIT_SSL_CERT environment variable.
http.sslKey
File containing the SSL private key when fetching or pushing over HTTPS.
Can be overridden by the GIT_SSL_KEY environment variable.
http.sslCertPasswordProtected
Enable git's password Prompt for the SSL certificate. Otherwise OpenSSL will
Prompt the user, possibly many times, if the certificate or private key is encrypted.
Can be overridden by the GIT_SSL_CERT_PASSWORD_PROTECTED environment variable.
يمكنك ضبط GIT_SSL_NO_VERIFY
على true
:
GIT_SSL_NO_VERIFY=true git clone https://example.com/path/to/git
أو بدلاً من ذلك ، قم بتكوين Git على عدم التحقق من الاتصال في سطر الأوامر:
git -c http.sslVerify=false clone https://example.com/path/to/git
لاحظ أنه إذا لم تقم بالتحقق من شهادات SSL/TLS ، فعندها تكون عرضة لهجمات MitM .
لست معجبًا كبيرًا بـ [EDIT: الإصدارات الأصلية من] الإجابات الحالية ، لأن تعطيل عمليات التحقق من الأمان يجب أن يكون الملاذ الأخير ، وليس الحل الأول المقدم. على الرغم من أنه لا يمكنك الوثوق بالشهادات الموقعة ذاتيا عند الاستلام الأول دون بعض طرق التحقق الإضافية ، إلا أن استخدام الشهادة لعمليات git
اللاحقة يجعل الحياة أكثر صعوبة على الأقل للهجمات التي تحدث فقط بعد قمت بتنزيل الشهادة . بمعنى آخر ، إذا كانت الشهادة التي قمت بتنزيلها هي أصلية ، فأنت في حالة جيدة من تلك النقطة فصاعدًا. على النقيض من ذلك ، إذا قمت ببساطة بتعطيل التحقق ، فأنت منفتح على مصراعيها لأي نوع من هجوم الرجل في الوسط في أي وقت .
لإعطاء مثال محدد: يوفر مستودع { repo.or.cz
الشهير شهادة موقعة ذاتيا . يمكنني تنزيل هذا الملف ، ووضعه في مكان ما مثل /etc/ssl/certs
، ثم القيام بما يلي:
# Initial clone
GIT_SSL_CAINFO=/etc/ssl/certs/rorcz_root_cert.pem \
git clone https://repo.or.cz/org-mode.git
# Ensure all future interactions with Origin remote also work
cd org-mode
git config http.sslCAInfo /etc/ssl/certs/rorcz_root_cert.pem
لاحظ أن استخدام git config
المحلي هنا (أي بدون --global
) يعني أن هذه الشهادة الموقعة ذاتياً موثوق بها فقط لهذا المستودع المحدد ، وهو Nice. إنه ألطف أيضًا من استخدام GIT_SSL_CAPATH
نظرًا لأنه يزيل خطر قيام git
بإجراء عملية التحقق من خلال "المرجع المصدق" المختلف الذي قد يكون عرضة للاختراق.
لم تقم مطلقًا بتعطيل جميع عمليات التحقق من SSL!
هذا يخلق ثقافة أمنية سيئة. لا تكون هذا الشخص.
مفاتيح التكوين التي تتبعها هي:
http.sslverify
- صحيح دائمًا. انظر أعلاه ملاحظة.هذه هي لتكوين شهادات المضيف تثق به
هذه هي لتكوين شهادتك للرد على تحديات SSL.
تطبيق الإعدادات المذكورة أعلاه بشكل انتقائي على مضيفين محددين.
.gitconfig
العام لمراجع الشهادات الموقعة ذاتيابالنسبة لي ولصالح زملائي هنا هو كيف تمكنا من الحصول على شهادات موقعة ذاتيًا للعمل دون تعطيل sslVerify
. قم بتعديل .gitconfig
لاستخدام git config --global -e
أضف هذه:
# Specify the scheme and Host as a 'context' that only these settings apply
# Must use Git v1.8.5+ for these contexts to work
[credential "https://your.domain.com"]
username = user.name
# Uncomment the credential helper that applies to your platform
# Windows
# helper = manager
# OSX
# helper = osxkeychain
# Linux (in-memory credential helper)
# helper = cache
# Linux (permanent storage credential helper)
# https://askubuntu.com/a/776335/491772
# Specify the scheme and Host as a 'context' that only these settings apply
# Must use Git v1.8.5+ for these contexts to work
[http "https://your.domain.com"]
##################################
# Self Signed Server Certificate #
##################################
# MUST be PEM format
# Some situations require both the CAPath AND CAInfo
sslCAInfo = /path/to/selfCA/self-signed-certificate.crt
sslCAPath = /path/to/selfCA/
sslVerify = true
###########################################
# Private Key and Certificate information #
###########################################
# Must be PEM format and include BEGIN CERTIFICATE / END CERTIFICATE,
# not just the BEGIN PRIVATE KEY / END PRIVATE KEY for Git to recognise it.
sslCert = /path/to/privatekey/myprivatecert.pem
# Even if your PEM file is password protected, set this to false.
# Setting this to true always asks for a password even if you don't have one.
# When you do have a password, even with this set to false it will Prompt anyhow.
sslCertPasswordProtected = 0
المراجع:
git clone
-إذا كنت بحاجة إلى تطبيقه على أساس الريبو ، فإن الوثائق تخبرك فقط بتشغيل git config --local
في دليل الريبو الخاص بك. حسنًا ، هذا ليس مفيدًا عندما لا تحصل على الريبو المستنسخة محليًا حتى الآن؟
يمكنك القيام بـ global -> local
hokey-pokey عن طريق تعيين التكوين العمومي الخاص بك كما هو موضح أعلاه ثم نسخ هذه الإعدادات إلى تكوين الريبو المحلي بمجرد استنساخه ...
أو ما يمكنك القيام به هو تحديد أوامر config في git clone
التي يتم تطبيقها على الريبو المستهدف بمجرد استنساخها.
# Declare variables to make clone command less verbose
OUR_CA_PATH=/path/to/selfCA/
OUR_CA_FILE=$OUR_CA_PATH/self-signed-certificate.crt
MY_PEM_FILE=/path/to/privatekey/myprivatecert.pem
SELF_SIGN_CONFIG="-c http.sslCAPath=$OUR_CA_PATH -c http.sslCAInfo=$OUR_CA_FILE -c http.sslVerify=1 -c http.sslCert=$MY_PEM_FILE -c http.sslCertPasswordProtected=0"
# With this environment variable defined it makes subsequent clones easier if you need to pull down multiple repos.
git clone $SELF_SIGN_CONFIG https://mygit.server.com/projects/myproject.git myproject/
EDIT: انظر VonC 's answer التي تشير إلى تحذير حول المسارات المطلقة والنسبية لإصدارات git محددة من 2.14.x/2.15 إلى هذه الخطوط الملاحية المنتظمة
git clone -c http.sslCAPath="/path/to/selfCA" -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" -c http.sslVerify=1 -c http.sslCert="/path/to/privatekey/myprivatecert.pem" -c http.sslCertPasswordProtected=0 https://mygit.server.com/projects/myproject.git myproject/
unable to load client key
إذا كنت تحاول ذلك على CentOS وكان ملف .pem
يمنحك
unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"
بعد ذلك سوف تريد إجابة StackOverflow حول كيفية استخدام curl
NSS بدلاً من فتح SSL.
وسترغب في إعادة بناء curl
من المصدر :
git clone http://github.com/curl/curl.git curl/
cd curl/
# Need these for ./buildconf
yum install autoconf automake libtool m4 nroff Perl -y
#Need these for ./configure
yum install openssl-devel openldap-devel libssh2-devel -y
./buildconf
su # Switch to super user to install into /usr/bin/curl
./configure --with-openssl --with-ldap --with-libssh2 --prefix=/usr/
make
make install
إعادة تشغيل الكمبيوتر لأن libcurl لا يزال في الذاكرة كمكتبة مشتركة
ذات صلة : كيفية إضافة شهادة CA Root مخصصة إلى متجر CA المستخدم بواسطة pip في Windows؟
ما زلت أواجه هذه المشكلة ، لذا فقد كتبت نصًا لتنزيل الشهادة الموقعة ذاتيا من الخادم وتثبيتها على ~/.gitcerts ، ثم تحديث git-config للإشارة إلى هذه الشهادات. يتم تخزينه في التكوين العام ، لذلك تحتاج فقط إلى تشغيله مرة واحدة لكل جهاز تحكم عن بعد.
https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh
تم اقتباس هذه الإجابة من هذه المقالة تأليف مايكل كوفمان.
استخدم Git for Windows مع شهادة SSL للشركات
المشكلة :
إذا كان لديك شهادة SSL خاصة بشركة وتريد استنساخ الريبو من وحدة التحكم أو VSCode ، فستحصل على الخطأ التالي:
قاتل: غير قادر على الوصول إلى ‘ https: // myserver/tfs/DefaultCollection/_git/Proj/ ': مشكلة شهادة SSL: غير قادر على الحصول على شهادة مُصدر محلي
الحل :
تصدير الشهادة الموقعة ذاتيا الجذر إلى ملف. يمكنك القيام بذلك من داخل متصفحك.
حدد موقع ملف "ca-bundle.crt" في مجلد git (الإصدار الحالي C:\Program Files\Git\usr\ssl\certs ولكن تم تغييره في الماضي). انسخ الملف إلى ملف تعريف المستخدم الخاص بك. افتحه باستخدام محرر نصوص مثل VSCode وأضف محتوى الشهادة التي تم تصديرها إلى نهاية الملف.
الآن يتعين علينا تكوين بوابة لاستخدام الملف الجديد:
git config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt
سيضيف هذا الإدخال التالي إلى ملف .gitconfig الخاص بك في جذر ملف تعريف المستخدم الخاص بك.
[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt
تحقق من إعدادات مكافحة الفيروسات وجدار الحماية لديك.
من يوم إلى آخر ، لم تنجح البوابة بعد الآن. مع ما تم وصفه أعلاه ، وجدت أن Kaspersky يضع شهادة جذر شخصية مضادة للفيروسات موقعة ذاتياً في المنتصف. لم أتمكن من السماح لـ Git بقبول تلك الشهادة باتباع الإرشادات المذكورة أعلاه. تخليت عن ذلك. ما يناسبني هو تعطيل الميزة لفحص الاتصالات المشفرة.
بعد ذلك ، يعمل git مرة أخرى مع تمكين sslVerify.
ملحوظة. لا يزال هذا غير مرضي بالنسبة لي ، لأنني أرغب في تفعيل ميزة مكافحة الفيروسات هذه. في الإعدادات المتقدمة ، تعرض Kaspersky قائمة بمواقع الويب التي لن تعمل مع هذه الميزة. لم يتم سرد جيثب كواحد منهم. سوف تحقق من ذلك في منتدى كاسبرسكي. يبدو أن هناك بعض الموضوعات ، على سبيل المثال https://forum.kaspersky.com/index.php؟/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211
كن حذرًا عند استخدام بطانة واحدة باستخدام sslKey أو sslCert ، كما في Josh Peak 's answer :
git clone -c http.sslCAPath="/path/to/selfCA" \
-c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" \
-c http.sslVerify=1 \
-c http.sslCert="/path/to/privatekey/myprivatecert.pem" \
-c http.sslCertPasswordProtected=0 \
https://mygit.server.com/projects/myproject.git myproject
سيكون Git 2.14.x/2.15 فقط (Q3 2015) قادرًا على تفسير مسار مثل ~username/mykey
بشكل صحيح (بينما لا يزال بإمكانه تفسير مسار مطلق مثل /path/to/privatekey
).
راجع الالتزام 8d15496 (20 يوليو 2017) بواسطة Junio C Hamano (gitster
) .
بمساعدة: تشارلز بيلي (hashpling
) .
(تم دمجها بواسطة Junio C Hamano - gitster
- في الالتزام 17b1e1d ، 11 أغسطس 2017)
http.c
:http.sslcert
وhttp.sslkey
كلاهما من أسماء المساراتمرة أخرى عندما تم إنشاء codepath http_options () الحديث لتحليل خيارات http. * المختلفة في 29508e1 ("عزل وظيفة طلب HTTP المشتركة" ، 2005-11-18 ، Git 0.99.9k) ، ثم تم تصحيحه لاحقًا لـ التفاعل بين ملفات التكوين المتعددة في 7059cd9 ("
http_init()
: إصلاح تحليل ملف التكوين" ، 2009-03-09 ، Git 1.6.3-rc0) ، قمنا بتحليل متغيرات التكوين مثلhttp.sslkey
،http.sslcert
كسلسلة Vanilla عادي ، لأنgit_config_pathname()
التي تفهم "~[username]/
" بادئة غير موجودة.في وقت لاحق ، قمنا بتحويل بعضها (أي
http.sslCAPath
وhttp.sslCAInfo
) لاستخدام الوظيفة ، وقمنا بإضافة متغيرات مثلhttp.cookeyFile
http.pinnedpubkey
لاستخدام الوظيفة من البداية. ولهذا السبب ، فهم جميع هذه المتغيرات بادئة "~[username]/
".اجعل المتغيرين المتبقيين ،
http.sslcert
وhttp.sslkey
، مدركين أيضًا للاتفاقية ، حيث أنهما كلاهما من الواضح أنهما اسمان للملفات.
في الملف .gitconfig يمكنك إضافة القيمة المذكورة أدناه لجعل الشهادة الذاتية الموقعة مقبولة
sslCAInfo = /home/XXXX/abc.crt
باستخدام إصدار 64 بت من Git على نظام Windows ، ما عليك سوى إضافة شهادة المرجع المصدق ذاتيًا إلى هذه الملفات:
إذا كانت شهادة خادم موقعة ذاتيا ، فقم بإضافتها
قد تكون إجابتي متأخرة ولكنها نجحت بالنسبة لي. قد يساعد شخص ما.
لقد جربت الخطوات المذكورة أعلاه والتي لم تحل المشكلة.
جرب هذا git config --global http.sslVerify false
أفعل ذلك مثل هذا:
git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git