কোনও সার্ভার থেকে শংসাপত্র পাওয়ার জন্য ওপেনসেল ব্যবহার করা


353

আমি একটি রিমোট সার্ভারের শংসাপত্র পাওয়ার চেষ্টা করছি, যা আমি পরে আমার কীস্টোরে যুক্ত করতে এবং আমার জাভা অ্যাপ্লিকেশনটির মধ্যে ব্যবহার করতে পারি।

একজন প্রবীণ দেব (যিনি ছুটিতে আছেন :() আমাকে জানিয়েছিলেন আমি এটি চালাতে পারি:

openssl s_client -connect host.host:9999

একটি কাঁচা শংসাপত্র ছুঁড়ে ফেলতে, যা আমি তারপরে অনুলিপি এবং রফতানি করতে পারি। আমি নিম্নলিখিত আউটপুট গ্রহণ:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

আমি এই বিকল্পটি দিয়ে চেষ্টাও করেছি

-showcerts 

এবং এটি (দেবিয়ানা মন আপনি চলমান)

-CApath /etc/ssl/certs/ 

তবে একই ত্রুটি পান।

এই উত্সটি বলেছে যে আমি সেই ক্যাপথ পতাকাটি ব্যবহার করতে পারি তবে এটি কোনওরকম সাহায্য করবে বলে মনে হচ্ছে না। আমি বহু পথ চেষ্টা করেও কোন লাভ হয়নি।

আমি কোথায় ভুল করছি দয়া করে আমাকে জানান।

উত্তর:


461

এসএনআই সহ

যদি রিমোট সার্ভারটি এসএনআই ব্যবহার করে (যা একক আইপি ঠিকানায় একাধিক এসএসএল হোস্ট ভাগ করে নিচ্ছে) সঠিক শংসাপত্র পাওয়ার জন্য আপনাকে সঠিক হোস্টনামটি প্রেরণ করতে হবে।

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

এসএনআই ছাড়া

যদি রিমোট সার্ভারটি এসএনআই ব্যবহার না করে তবে আপনি -servernameপ্যারামিটারটি এড়িয়ে যেতে পারেন :

openssl s_client -showcerts -connect www.example.com:443 </dev/null


কোনও সাইটের শংসাপত্রের সম্পূর্ণ বিশদটি দেখতে আপনি এই শৃঙ্খলাবদ্ধ কমান্ডগুলিও ব্যবহার করতে পারেন:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

3
হুম। এই কমান্ডটি চেষ্টা করার সময় আমি এখনও একই ত্রুটি পেয়েছি। আমি লক্ষ্য করেছি যে আমার ওপেনসেল সংস্করণটি 'ওপেনএসএসএল 0.9.8 জি 19 অক্টোবর 2007'। তোমার কোন ধারনা আছে?
পেস্টি

39
দরকারী: echo "" | openssl s_client -connect server:port -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' stackoverflow.com/a/12918442/843000
mbrownnyc

16
বিকল্প দরকারী স্ক্রিপ্ট, madboa.com থেকে :echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem

9
এই একটি বিট আরো সংক্ষিপ্ত করতে, আপনাকে প্রতিস্থাপন করতে পারেন sedসঙ্গে openssl x509, এবং একটি উপ-শেল ব্যবহারে এটা পড়তে:openssl x509 -in <(openssl s_client -connect server:port -prexit 2>/dev/null)
গেব মার্টিন-Dempesy

27
এছাড়াওecho | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
ম্যাটসিজল

68

যদিও আমি এরির উত্তরটির সাথে একমত (এবং এটি উত্সাহিত করেছি :), উইন্ডোতে জাভা (যেখানে এটি মোতায়েন করা দরকার ছিল) এর সাথে কাজ করার জন্য আমার একটি অতিরিক্ত পদক্ষেপ করা দরকার:

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

openssl x509 -outform DERরূপান্তর যুক্ত করার আগে , আমি উইন্ডোতে কিটিওল থেকে শংসাপত্রের ফর্ম্যাট সম্পর্কে অভিযোগ পেয়ে একটি ত্রুটি পেয়েছিলাম। .Der ফাইলটি আমদানি করা ভাল কাজ করেছে।


অস্বাভাবিক. আমি জাভা 6 সাল থেকে উইন্ডোতে কীটোল সহ পিইএম শংসাপত্রগুলি ব্যবহার করছি এবং কখনই কোনও সমস্যার মুখোমুখি হইনি।
imgx64

39

দেখা যাচ্ছে এখানে আরও জটিলতা রয়েছে: এই ঘূর্ণায়মানটি পাওয়ার জন্য আমার আরও অনেক বিশদ সরবরাহ করতে হবে। আমি মনে করি এটি ক্লায়েন্টের প্রমাণীকরণের প্রয়োজন এমন একটি সংযোগ এবং শংসাপত্রগুলি নিক্ষেপ করা হয়েছিল এমন পর্যায়ে চালিয়ে যাওয়ার জন্য হানশাকে আরও তথ্যের প্রয়োজন ছিল with

এখানে আমার কার্যনির্বাহী আদেশ:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

আশা করি এটি যে কেউ আরও কিছু তথ্যের সাথে করতে পারে তার জন্য সঠিক দিকের একটি টান।


6
আমি দুঃখিত, তবে আপনার উত্তরটি খুব একটা বোঝায় না। শংসাপত্রটি পাওয়ার জন্য আপনাকে সার্ভারে শংসাপত্রটি পাস করতে হবে?
এরি ম্যানিয়েটিস

2
হাঁ। ক্লায়েন্টের প্রমাণীকরণ AFAIK K
15:32

11
দেখা যাচ্ছে যে '-প্রেমিক' সেই ডেটাও ফিরিয়ে দেবে। যেমন; ওপেনএসএল এস_ক্লিয়েন্ট-সংযোগ হোস্ট: পোর্ট-প্রিফিক্স
রবার্ট

39

পিএম ফর্ম্যাটে রিমোট সার্ভার থেকে শংসাপত্রটি বের করার জন্য একটি ওয়ান-লাইনার, এবার ব্যবহার করে sed:

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

2
এইটি শংসাপত্রটি বের করার জন্য প্রায় নিখুঁত, কেবল -servernameঅপশনটি অনুপস্থিত , কেন জানি না, তবে আমাকে পুরো শংসাপত্রটি পেতে এটি ব্যবহার করতে হয়েছিল।
কার্ল.এস

সার্ভার নাম ইঙ্গিত (SNI) এর জন্য -Sservername প্রয়োজন। ওয়েব অনুসন্ধান অন্যান্য অংশে প্রসারিত করতে পারে।
স্যাম গ্লেস্ক

32

এর জন্য সবচেয়ে সহজ কমান্ড লাইন, এতে কী-স্টোরে যোগ করার জন্য পিইএম আউটপুট অন্তর্ভুক্ত রয়েছে, পাশাপাশি একটি মানব পাঠযোগ্য আউটপুট এবং এসএনআই সমর্থন করে, আপনি যদি এইচটিটিপি সার্ভারের সাথে কাজ করছেন তবে তা গুরুত্বপূর্ণ:

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

-Servername বিকল্প sni সমর্থন এবং সক্ষম করা openssl x509 -text কপি করে প্রিন্ট মানুষের পাঠযোগ্য বিন্যাসে শংসাপত্র।


আপনি উদাহরণস্বরূপ ডটকমের পরিবর্তে ws.example.com হিসাবে আপনার সাব-ডোমেইনটিতে নিজের সাব-ডোমেইন যুক্ত করতে পারেন (এটি-সংযোগের প্যারামিটারেও প্রয়োগ করুন)।
রাসেলহফ

24

রিমোট সার্ভারের শংসাপত্র পাওয়ার জন্য আপনি opensslসরঞ্জামটি ব্যবহার করতে পারেন এবং এটির মধ্যে খুঁজে পেতে পারেন BEGIN CERTIFICATEএবং END CERTIFICATEযা আপনার শংসাপত্রের ফাইলে (সিআরটি) অনুলিপি করে আটকানো দরকার।

কমান্ডটি এটি প্রদর্শন করছে:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

চেইন থেকে সমস্ত শংসাপত্র ফেরত পেতে, কেবল g(গ্লোবাল) এর মতো যুক্ত করুন:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq

তারপরে আপনি কেবল নিজের শংসাপত্রের ফাইলটি ( file.crt) আপনার কীচেইনে আমদানি করতে পারেন এবং এটি বিশ্বস্ত করতে পারেন, তাই জাভার অভিযোগ করা উচিত নয়।

ওএস এক্স-তে আপনি ফাইলটিতে ডাবল-ক্লিক করতে পারেন বা আপনার কীচেইন অ্যাক্সেসে টেনে আনুন এবং ছেড়ে দিতে পারেন, যাতে এটি লগইন / শংসাপত্রগুলিতে উপস্থিত হবে। তারপরে আমদানিকৃত শংসাপত্রের উপর ডাবল ক্লিক করুন এবং এটি এসএসএলের জন্য সর্বদা বিশ্বাস করুন

CentOS 5 এ আপনি এগুলিকে /etc/pki/tls/certs/ca-bundle.crtফাইল (এবং রান sudo update-ca-trust force-enable:) এ যুক্ত করতে পারেন , বা সেন্টোস 6 এ সেগুলিতে অনুলিপি করতে /etc/pki/ca-trust/source/anchors/এবং চালাতে পারেন sudo update-ca-trust extract

উবুন্টুতে, এগুলিতে অনুলিপি করুন /usr/local/share/ca-certificatesএবং চালান sudo update-ca-certificates


12
HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

6

কেবলমাত্র শংসাপত্র শৃঙ্খলা প্রিন্ট করতে সার্ভারের শংসাপত্রটি নয়:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

CentOS / RHEL 6/7 এ সিএ ট্রাস্ট আপডেট করতে:

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

CentOS / RHEL 5 এ:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt

CentOS7 এ ঠিক আমার কী প্রয়োজন। ধন্যবাদ!
আর্থার হেবার্ট

5

আপনি পরবর্তী বাশ স্ক্রিপ্ট ব্যবহার করে সার্ভারের মূল শংসাপত্রটি পেতে এবং সঞ্চয় করতে পারেন:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

কেবল প্রয়োজনীয় ভেরিয়েবলগুলি ওভাররাইট করুন।


4

আপনার সার্ভারে একটি ইমেল সার্ভার (মাইক্রোসফট এক্সচেঞ্জ বা Zimbra) হয়, তাহলে হয়তো আপনি যোগ করতে হবে starttlsএবং smtpপতাকা:

openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem

কোথায়,

  • HOST_EMAIL হ'ল সার্ভার ডোমেন, উদাহরণস্বরূপ, মেল-server.com .com

  • SECURE_PORT হল যোগাযোগ বন্দর, উদাহরণস্বরূপ, 587 বা 465

  • CERTIFICATE_NAME আউটপুট ফাইলের নাম (বেস 64 / পিইএম ফর্ম্যাট)


2

আমার মতো অন্যদের সুবিধার জন্য যারা এডাব্লুএস ক্লাউডফ্রন্ট অ্যাক্সেস করার সময় এখানে ভাল পরামর্শ অনুসরণ করার চেষ্টা করেছিল তবে ব্যর্থ হয়েছিল, কৌশলটি যুক্ত করা -servername domain.name..

সূত্র: https://serverfault.com/a/780450/8972

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.