Katakanlah saya ingin mendapatkan secara https://golang.org
terprogram. Saat ini golang.org (ssl) memiliki sertifikat buruk yang dikeluarkan untuk *.appspot.com
Jadi ketika saya menjalankan ini:
package main
import (
"log"
"net/http"
)
func main() {
_, err := http.Get("https://golang.org/")
if err != nil {
log.Fatal(err)
}
}
Saya mendapatkan (seperti yang saya harapkan)
Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org
Sekarang, saya ingin memercayai sertifikat ini sendiri (bayangkan sertifikat yang diterbitkan sendiri di mana saya dapat memvalidasi sidik jari, dll.): Bagaimana saya bisa membuat permintaan dan memvalidasi / mempercayai sertifikat?
Saya mungkin perlu menggunakan openssl untuk mengunduh sertifikat, memuatnya ke file saya dan mengisi tls.Config
struct!?
Jawaban:
Catatan keamanan: Menonaktifkan pemeriksaan keamanan berbahaya dan harus dihindari
Anda dapat menonaktifkan pemeriksaan keamanan secara global untuk semua permintaan klien default:
Anda dapat menonaktifkan pemeriksaan keamanan untuk klien:
sumber
InsecureSkipVerify: true
. Apakah itu mungkin?NameToCertificate
mungkin membantu, lihattls.Config
dokumentasi: golang.org/pkg/crypto/tls/#ConfigDialer.Timeout
.Berikut adalah cara untuk melakukannya tanpa kehilangan pengaturan default
DefaultTransport
, dan tanpa memerlukan permintaan palsu sesuai komentar pengguna.MEMPERBARUI
Cara yang lebih pendek:
Cara yang tepat (mulai Go 1.13) (disediakan oleh jawaban di bawah ):
Peringatan : Hanya untuk tujuan pengujian / pengembangan. Ada lagi, lanjutkan dengan risiko Anda sendiri !!!
sumber
mytransportsettings := &(*http.DefaultTransport.(*http.Transport))
dan kemudian hanya memodifikasi konfigurasi klien TLSmytransportsettings.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
?Semua jawaban ini salah! Jangan gunakan
InsecureSkipVerify
untuk berurusan dengan CN yang tidak cocok dengan nama host. Pengembang Go dengan tidak bijaksana bersikeras untuk tidak menonaktifkan pemeriksaan hostname (yang memiliki kegunaan yang sah - terowongan, nats, sertifikat cluster bersama, dll), sementara juga memiliki sesuatu yang terlihat serupa tetapi sebenarnya sama sekali mengabaikan pemeriksaan sertifikat. Anda perlu tahu bahwa sertifikat itu valid dan ditandatangani oleh sertifikat yang Anda percayai. Tetapi dalam skenario umum, Anda tahu bahwa CN tidak akan cocok dengan nama host yang terhubung dengan Anda. Bagi mereka, mengaturServerName
tentangtls.Config
. Jikatls.Config.ServerName
== remoteServerCN, maka pemeriksaan sertifikat akan berhasil. Ini yang kamu inginkan.InsecureSkipVerify
berarti tidak ada otentikasi; dan itu sudah matang untuk Man-In-The-Middle; mengalahkan tujuan menggunakan TLS.Ada satu penggunaan yang sah untuk
InsecureSkipVerify
: gunakan untuk terhubung ke host dan ambil sertifikatnya, lalu segera putuskan sambungan. Jika Anda mengatur kode Anda untuk digunakanInsecureSkipVerify
, itu umumnya karena Anda tidak mengaturServerName
dengan benar (itu harus berasal dari env var atau sesuatu - jangan pusing-pusing tentang persyaratan ini ... lakukan dengan benar).Khususnya, jika Anda menggunakan sertifikat klien dan mengandalkannya untuk otentikasi, pada dasarnya Anda memiliki info masuk palsu yang tidak benar-benar masuk lagi. Menolak kode yang benar
InsecureSkipVerify
, atau Anda akan belajar apa yang salah dengan itu dengan cara yang sulit!sumber
Cara yang benar untuk melakukan ini jika Anda ingin mempertahankan pengaturan transportasi default sekarang (pada Go 1.13):
Transport.Clone membuat salinan transportasi yang dalam. Dengan cara ini Anda tidak perlu khawatir kehilangan bidang baru yang ditambahkan ke
Transport
struct dari waktu ke waktu.sumber
Jika Anda ingin menggunakan pengaturan default dari paket http, jadi Anda tidak perlu membuat objek Transport dan Client baru, Anda dapat mengubah untuk mengabaikan verifikasi sertifikat seperti ini:
sumber
panic: runtime error: invalid memory address or nil pointer dereference
Secara umum, Domain DNS URL HARUS cocok dengan Subjek Sertifikat sertifikat.
Di masa lalu ini bisa dengan menetapkan domain sebagai cn dari sertifikat atau dengan menetapkan domain sebagai Nama Alternatif Subjek.
Dukungan untuk cn sudah lama tidak digunakan (sejak tahun 2000 di RFC 2818 ) dan browser Chrome bahkan tidak akan melihat cn lagi sehingga hari ini Anda harus memiliki Domain DNS dari URL sebagai Nama Alternatif Subjek.
RFC 6125 yang melarang memeriksa cn jika SAN untuk Domain DNS ada, tetapi tidak jika SAN untuk Alamat IP ada. RFC 6125 juga mengulangi bahwa cn sudah usang yang sudah dikatakan dalam RFC 2818. Dan Forum Browser Otoritas Sertifikasi akan hadir yang dikombinasikan dengan RFC 6125 pada dasarnya berarti bahwa cn tidak akan pernah diperiksa untuk nama Domain DNS.
sumber