খারাপ শংসাপত্র সহ একটি https অনুরোধ কীভাবে করবেন?


128

বলুন আমি https://golang.orgঅগ্রগতি অর্জন করতে চাই । বর্তমানে golang.org (এসএসএল) এর একটি খারাপ শংসাপত্র রয়েছে যা এটি জারি করা হয় *.appspot.comতাই আমি যখন এটি চালাই:

package main

import (
    "log"
    "net/http"
)

func main() {
    _, err := http.Get("https://golang.org/")
    if err != nil {
        log.Fatal(err)
    }
}

আমি পেয়েছি (যেমনটি আমি প্রত্যাশা করেছি)

Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org

এখন, আমি নিজেই এই শংসাপত্রটিকে বিশ্বাস করতে চাই (একটি স্ব-জারি করা শংসাপত্রের কল্পনা করুন যেখানে আমি আঙুলের ছাপ ইত্যাদি যাচাই করতে পারি): কীভাবে আমি একটি অনুরোধ করতে পারি এবং শংসাপত্রটিকে বৈধতা / বিশ্বাস করতে পারি?

শংসাপত্রটি ডাউনলোড করতে, আমার ফাইলে এটি লোড করুন এবং tls.Configস্ট্রাক্ট পূরণের জন্য আমার সম্ভবত ওপেনসেল ব্যবহার করা দরকার !?


5
এটি কোনও "খারাপ শংসাপত্র" নয় এটি একটি ভিন্ন সিএন সহ একটি শংসাপত্র। InsecureSkipVerify এখানে বৈধ ব্যবহার নয়। আপনি যা সংযোগের চেষ্টা করছেন তার সাথে মিল রাখতে আপনাকে অবশ্যই tls.Config এ সার্ভারনাম সেট করতে হবে। এই স্ট্যাকওভারফ্লো পোস্টটি গো কোডের এই বৃহত সুরক্ষা গর্তটি সর্বত্র ছড়িয়ে দিচ্ছে। InsecureSkipVerify সমস্ত শংসাপত্র পরীক্ষা করে না। আপনি যা চান তা যাচাই করা হ'ল সিএন হোস্টনামের সাথে মেলে না, এমনকি শংসাপত্রটি কোনও বিশ্বস্ত সত্তা বৈধভাবে স্বাক্ষর করেছিলেন। টানেল এবং NATS বৈধভাবে এটি মেলেনি।
রব

উত্তর:


283

সুরক্ষা নোট: সুরক্ষা চেক অক্ষম করা বিপজ্জনক এবং এড়ানো উচিত

আপনি ডিফল্ট ক্লায়েন্টের সমস্ত অনুরোধের জন্য বিশ্বব্যাপী সুরক্ষা চেকগুলি অক্ষম করতে পারেন:

package main

import (
    "fmt"
    "net/http"
    "crypto/tls"
)

func main() {
    http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
    _, err := http.Get("https://golang.org/")
    if err != nil {
        fmt.Println(err)
    }
}

আপনি একটি ক্লায়েন্টের জন্য সুরক্ষা চেক অক্ষম করতে পারেন:

package main

import (
    "fmt"
    "net/http"
    "crypto/tls"
)

func main() {
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
    client := &http.Client{Transport: tr}
    _, err := client.Get("https://golang.org/")
    if err != nil {
        fmt.Println(err)
    }
}

17
আমি আশ্চর্য হয়েছি যেখানে কোনও বিশ্বস্ত শংসাপত্র রাখা উচিত যাতে সংযোগটি ব্যবহার না করেই ব্যবহার করা যায় InsecureSkipVerify: true। এটা কি সম্ভব?
টপস্কিপ

7
NameToCertificateসহায়তা করতে পারে, tls.Configডকুমেন্টেশনটি দেখুন: golang.org/pkg/crypto/tls/#Config
সাইবারডেলিয়া

1
কাস্টম সিএ শংসাপত্র পুল যুক্ত করার জন্য এখানে একটি উদাহরণ রয়েছে: golang.org/pkg/crypto/tls/#example_Dial আপনি এটি একটি HTTP ক্লায়েন্টেও ব্যবহার করতে পারেন।
বিটবোরড

7
প্রচুর লোক এখানে হোস্টনাম চেকগুলি অক্ষম করার চেষ্টা করছে (শংসাপত্রের চেকগুলি পুরোপুরি অক্ষম করে না)। এটি ভুল উত্তর। আপনি যে সংস্থার সাথে সংযোগ করছেন তার সিএন মেলে আপনি টিএলএস কনফিগারেশনে সার্ভারনাম সেট করার দরকার আছে, যদি এটি আপনার সাথে সংযুক্ত ডিএনএস নাম না হয়। InsecureSkipVerify বন্দরের কাছে সরল-পুরাতন-টেলনেটের চেয়ে বেশি সুরক্ষিত নয়। এই সেটিংটির সাথে কোনও প্রমাণীকরণ নেই। পরিবর্তে ব্যবহারকারীর সার্ভারনাম!
রব

8
সাবধানতা: এমন একটি পরিবহণ এর ক্ষেত্রের বেশিরভাগ ক্ষেত্রে শূন্য-মান ব্যবহার করে এবং তাই সমস্ত ডিফল্টকে হারিয়ে ফেলেনীচের উত্তরটি যেমন পরামর্শ দেয়, আপনি সেগুলি অনুলিপি করতে চাইতে পারেন। আমরা ফাইল বর্ণনাকারী থেকে বেরিয়ে যাচ্ছি কেন তা ভেবে আমাদের বেশ মজাদার অভিজ্ঞতা হয়েছিল , কারণ আমরা এটি হারিয়েছি Dialer.Timeout
mknecht

26

এর ডিফল্ট সেটিংস না হারিয়ে DefaultTransportএবং ব্যবহারকারীর মন্তব্যে জাল অনুরোধের প্রয়োজন ছাড়াই এটি করার একটি উপায় এখানে ।

defaultTransport := http.DefaultTransport.(*http.Transport)

// Create new Transport that ignores self-signed SSL
customTransport := &http.Transport{
  Proxy:                 defaultTransport.Proxy,
  DialContext:           defaultTransport.DialContext,
  MaxIdleConns:          defaultTransport.MaxIdleConns,
  IdleConnTimeout:       defaultTransport.IdleConnTimeout,
  ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout,
  TLSHandshakeTimeout:   defaultTransport.TLSHandshakeTimeout,
  TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},
}

হালনাগাদ

খাটো উপায়:

customTransport := &(*http.DefaultTransport.(*http.Transport)) // make shallow copy
customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}

যথাযথ উপায় (Go 1.13 হিসাবে) ( নীচে উত্তর দিয়ে দেওয়া ):

customTransport := http.DefaultTransport.(*http.Transport).Clone()
customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}

সতর্কতা : কেবল পরীক্ষার / বিকাশের উদ্দেশ্যে। অন্য কিছু, আপনার নিজের ঝুঁকিতে এগিয়ে যান !!!


ডিফল্ট ট্রান্সপোর্ট সেটিংস ব্যবহার করে অনুলিপি করে কেবল mytransportsettings := &(*http.DefaultTransport.(*http.Transport))টিএলএস ক্লায়েন্ট কনফিগারেশনটি সংশোধন করা কি সহজ হবে না mytransportsettings.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}?
21

চেষ্টা করে দেখার মতো, আমি মনে করি যে আমি আসল ডিফল্ট ট্রান্সপোর্টকে পরিবর্তন করব না তা নিশ্চিত করার চেষ্টা করছিলাম
জোনাথন লিন

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

19

এই সব উত্তর ভুল! InsecureSkipVerifyহোস্টের সাথে মেলে না এমন কোনও সিএন নিয়ে ডিল করতে ব্যবহার করবেন না । গো বিকাশকারীরা বুদ্ধিমানভাবে হোস্টনাম চেকগুলি অক্ষম না করার বিষয়ে অনড় ছিল (যার বৈধ ব্যবহার রয়েছে - টানেলস, নেটস, শেয়ার্ড ক্লাস্টার শংসাপত্রগুলি ইত্যাদি), এমন কিছুর মিল রয়েছে যা দেখতে অনুরূপ তবে বাস্তবে শংসাপত্রের চেকটিকে সম্পূর্ণ উপেক্ষা করে। আপনার জানা দরকার যে শংসাপত্রটি বৈধ এবং আপনার দ্বারা বিশ্বাস করা শংসাপত্রের দ্বারা স্বাক্ষরিত। তবে সাধারণ পরিস্থিতিতে আপনি জানেন যে সিএন আপনার সাথে সংযুক্ত হোস্টনামের সাথে মেলে না। তাদের জন্য, সেট ServerNameউপর tls.Config। যদি tls.Config.ServerName== রিমোট সার্ভারসিএন হয়, তবে শংসাপত্রের চেকটি সফল হবে। এটাই তুমি চাও. InsecureSkipVerifyএর অর্থ নেই যে কোনও প্রমাণীকরণ নেই; এবং এটি একটি মধ্য-মধ্যের জন্য পাকা; টিএলএস ব্যবহারের উদ্দেশ্যকে পরাস্ত করা।

এর একটি বৈধ ব্যবহার রয়েছে InsecureSkipVerify: একটি হোস্টের সাথে সংযোগ করতে এটি ব্যবহার করুন এবং এর শংসাপত্রটি ধরুন, তারপরে তাত্ক্ষণিকভাবে সংযোগ বিচ্ছিন্ন করুন। আপনি যদি নিজের কোডটি ব্যবহারের জন্য সেটআপ করেন তবে InsecureSkipVerifyএটি সাধারণত কারণ আপনি ServerNameসঠিকভাবে সেট করেন নি (এটি কোনও এনভির ভার বা কোনও কিছু থেকে আসা দরকার - এই প্রয়োজনীয়তা সম্পর্কে বেলি-ব্যথা করবেন না ... এটি সঠিকভাবে করুন)।

বিশেষত, আপনি যদি ক্লায়েন্ট শংসাপত্রগুলি ব্যবহার করেন এবং প্রমাণীকরণের জন্য তাদের উপর নির্ভর করেন তবে আপনার মূলত একটি জাল লগইন রয়েছে যা আসলে আর কোনও লগইন করে না। যে কোডটি করে তা প্রত্যাখ্যান করুন InsecureSkipVerifyবা আপনি এর মাধ্যমে কী ভুল তা কঠিন উপায়ে শিখবেন!


1
আপনি কি এমন কোনও সাইট জানেন যা আমি এটি পরীক্ষা করতে পারি? গোলং org এখন আর ত্রুটি ফেলে না।
টপস্কিপ

3
এই উত্তরটি ভয়ানকভাবে বিভ্রান্তিকর। হোস্টনাম নির্বিশেষে আপনি যদি বৈধভাবে স্বাক্ষরিত কোনও শংসাপত্র গ্রহণ করেন তবে আপনি এখনও সত্যিকারের সুরক্ষা পাচ্ছেন না। আমি নিয়ন্ত্রণ করি যে কোনও ডোমেনের জন্য আমি সহজেই একটি বৈধ শংসাপত্র পেতে পারি; আপনি যদি কেবল টিএলএস চেকের জন্য আমার হোস্টনামটি নির্দিষ্ট করতে চলেছেন তবে আপনি যে সত্যতা আমি সত্যই আমি বলছি আমি হচ্ছি তা আপনি হারিয়ে ফেলেন। এই মুহুর্তে, শংসাপত্রটি "জায়েট" হ'ল সত্য নয়; এটি এখনও ভুল এবং আপনি মাঝখানে মানুষের পক্ষে এখনও দুর্বল।
ড্যানিয়েল ফারেল

5
এমন একটি এন্টারপ্রাইজে যেখানে আপনি আসলে কোনও বাণিজ্যিক সিএ-তে বিশ্বাস করেন না (যেমন: তারা যদি মার্কিন যুক্তরাষ্ট্রে বাইরে থাকেন) এবং আপনার এন্টারপ্রাইজের জন্য একটি সিএ প্রতিস্থাপন করুন, আপনাকে কেবল এটি আপনার শংসাপত্রগুলির মধ্যে একটি যাচাই করতে হবে। হোস্ট-নেম চেক এমন পরিস্থিতিতে রয়েছে যেখানে ব্যবহারকারীরা হোস্টনামটি মিলবে বলে আশা করছেন, তবে ডিএনএস নিরাপদ নয় isn't এন্টারপ্রাইজে আপনি সাধারণত মেশিনগুলির একটি ক্লাস্টারের সাথে সংযুক্ত হন যেখানে হোস্টনাম / আইপি মিলানো সম্ভব নয়, কারণ এটি নতুন আইপি এর আওতায় তৈরি মেশিনের সঠিক ক্লোনস। ডিএনএস নামটি শংসাপত্রটি সন্ধান করে এবং সার্টটি আইডি, ডিএনএস নাম নয়।
রব

3
ধারণাটি হ'ল ক্লায়েন্ট কোডটি কেবলমাত্র এন্টারপ্রাইজ সিএকে বিশ্বাস করে। এটি বর্তমানে ব্যবহৃত সিএ সিস্টেমের চেয়ে আসলে অনেক বেশি সুরক্ষিত। সেক্ষেত্রে কোনও কিছুই (থাওতে, ভার্সাইন ইত্যাদি) ... বিশ্বাসযোগ্য নয়। আমরা যে সিএ চালাচ্ছি। ওয়েব ব্রাউজারগুলির বিশাল বিশ্বাসের তালিকা রয়েছে। একে অপরের সাথে কথা বলার পরিষেবাগুলির বিশ্বাস ফাইলে কেবল একটি সিএ থাকে।
রব

1
আপনাকে ধন্যবাদ @ রব আমার একটি অভিন্ন সেটআপ আছে যেখানে আমাদের পরিষেবাগুলি কেবল একই, একক সিএ এবং অন্য কিছুই বিশ্বাস করে না। এটি গুরুত্বপূর্ণ তথ্য এবং অনেক সাহায্য।
ব্যবহারকারী 99999991

8

আপনি যদি ডিফল্ট পরিবহন সেটিংস বজায় রাখতে চান তবে এটি করার সঠিক উপায়টি এখন (গো 1.13 তে) রয়েছে:

customTransport := http.DefaultTransport.(*http.Transport).Clone()
customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
client = &http.Client{Transport: customTransport}

পরিবহন.ক্লোন পরিবহনের একটি গভীর অনুলিপি তৈরি করে। এইভাবে আপনাকে এমন কোনও নতুন ক্ষেত্র হারিয়ে যাওয়ার বিষয়ে চিন্তা করতে হবে না যা Transportসময়ের সাথে সাথে স্ট্রাক্টে যুক্ত হয় ।


7

আপনি যদি HTTP প্যাকেজ থেকে ডিফল্ট সেটিংস ব্যবহার করতে চান, সুতরাং আপনাকে কোনও নতুন পরিবহন এবং ক্লায়েন্ট অবজেক্ট তৈরি করার দরকার নেই, আপনি শংসাপত্র যাচাইকরণটিকে এড়ানো উপেক্ষা করার জন্য এটি পরিবর্তন করতে পারেন:

tr := http.DefaultTransport.(*http.Transport)
tr.TLSClientConfig.InsecureSkipVerify = true

7
এটি করার ফলেpanic: runtime error: invalid memory address or nil pointer dereference
অস্কার রাইজ

6
আপনি যদি এর আগে ডিফল্ট HTTP অনুরোধক ব্যবহার না করেন তবে আপনাকে অবশ্যই একটি জাল অনুরোধ জোর করতে হবে যাতে এটি ডিফল্ট ট্রান্সপোর্টের সূচনা হয়
কর্নেল ড্যামিয়ান

1
এটি হোস্টনাম চেকগুলি অক্ষম করছে না। এটি সমস্ত শংসাপত্রের চেকগুলি অক্ষম করে। আপনি যা সংযোগ করছেন তার শংসাপত্রে আপনাকে সার্ভারনাম সিএন এর সমান সেট করতে বাধ্য করে। InsecureSkipVerify আসল পরিষেবাগুলিতে ফরোয়ার্ড করার ভান করে এমন দুর্বৃত্ত এমআইটিএম সার্ভারের সাথে সংযুক্ত হবে। ইনসিকিউরস্কিপভাইরিফাইয়ের জন্য কেবলমাত্র বৈধ ব্যবহার হ'ল দূরবর্তী প্রান্তের শংসাপত্রটি অবিলম্বে গ্রহণ করা এবং অবিলম্বে সংযোগ বিচ্ছিন্ন করা।
রব

এটি কেবল ঠিক আছে যদি আপনি ALSO একটি VerifyPeerCertificate নির্দিষ্ট করে থাকেন। আপনি যদি সবেমাত্র ইনসিকিউরস্কিপটি যাচাই করে থাকেন তবে তা একেবারেই চেক হয় না। তবে একটি যাচাইপিয়রকার্টিফিকেট যুক্ত করা হয়েছে যাতে আপনার যা প্রয়োজন তা করার জন্য আপনি চেকটি পুনরায় লিখতে পারেন। আপনি হোস্টনাম বা সম্ভবত মেয়াদোত্তীকরণের তারিখটিকে উপেক্ষা করতে চাইতে পারেন। গুগল যা যা করে তা VerifyPeerCertificate এর বিভিন্ন বাস্তবায়নের জন্য।
রব

0

সাধারণত, ইউআরএল এর ডিএনএস ডোমেন শংসাপত্রের শংসাপত্র সাবজেক্টের সাথে মেলে।

পূর্ববর্তী সময়ে এটি হয় শংসাপত্রের সিএন হিসাবে ডোমেন সেট করে অথবা ডোমেনটিকে সাবজেক্ট বিকল্প বিকল্প হিসাবে সেট করে।

সিএন এর জন্য সমর্থন দীর্ঘ সময়ের জন্য অবচিত করা হয়েছিল (2000 সাল থেকে আরএফসি 2818 ) এবং ক্রোম ব্রাউজার এমনকি সিএন এর দিকে আর তাকাবে না তাই আজ আপনাকে সাবজেক্ট বিকল্প বিকল্প হিসাবে URL এর DNS ডোমেন থাকা দরকার main

আরএফসি 6125 যা ডিএনএস ডোমেনের জন্য সান উপস্থিত থাকলে সিএন পরীক্ষা করতে নিষেধ করে, তবে আইপি ঠিকানার জন্য সান উপস্থিত থাকলে তা নয়। আরএফসি 6125 এও পুনরাবৃত্তি করে যে সিএন অবচিত হয়ে গেছে যা ইতিমধ্যে আরএফসি 2818-এ বলা হয়েছিল the

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