Layanan VPC jarak jauh hanya mendukung akses melalui nama domain. Akses langsung menggunakan IP akan memicu kesalahan, menyebabkan permintaan gagal. Topik ini menjelaskan cara menyelesaikan masalah ini dengan menambahkan nama domain ke host permintaan untuk mengakses layanan HTTPS melalui alamat IP, sehingga memenuhi persyaratan akses jarak jauh untuk tugas-tugas seperti Spark atau UDF.
Akses langsung ke layanan HTTPS menggunakan IP gagal
Deskripsi masalah
Fitur HTTPS sangat penting saat mengakses layanan VPC jarak jauh seperti KMS dan OSS untuk tugas Spark atau UDF. Namun, mengakses layanan ini secara langsung menggunakan IP menghasilkan pesan kesalahan seperti yang ditunjukkan di bawah ini:
SSL: tidak ada nama subjek sertifikat alternatif yang cocok dengan nama host target '47.116.XX.XX'
Lebih banyak detail di sini: https://curl.haxx.se/docs/sslcerts.html
curl gagal memverifikasi legitimasi server dan oleh karena itu tidak dapat membentuk koneksi aman dengannya.
Untuk mempelajari lebih lanjut tentang situasi ini dan cara memperbaikinya, silakan kunjungi halaman web yang disebutkan di atas.Solusi
Untuk menyelesaikan masalah kegagalan verifikasi sertifikat SSL saat mengakses layanan HTTPS secara langsung menggunakan IP, tambahkan nama domain ke host permintaan.
1. Ambil informasi IP dari layanan jarak jauh.
Gunakan perintah ping
Masukkan perintah berikut di konsol Windows atau Linux untuk mengambil IP layanan jarak jauh:
ping service.cn-shanghai-vpc.maxcompute.aliyun-inc.comHasil yang dikembalikan dalam lingkungan Windows adalah sebagai berikut:

Hasil yang dikembalikan dalam lingkungan Linux adalah sebagai berikut:

Gunakan perintah dig
Instal Bind-utils di lingkungan Anda.
Windows
Unduh BIND9.17.12.x64.zip, ekstrak ke direktori tertentu, seperti
D:\install\BIND9.17.12.x64, dan tambahkan jalur ini ke variabel lingkungan Path di Windows.Linux (CentOS)
Jalankan perintah
sudo yum install bind-utilsdi konsol Linux untuk menginstal.
Jalankan perintah berikut di konsol:
dig service.cn-shanghai-vpc.maxcompute.aliyun-inc.comHasil yang dikembalikan adalah sebagai berikut:
Windows

Linux

2. Konfigurasikan informasi IP.
Referensi contoh kode berikut untuk menambahkan informasi IP ke access_url dari permintaan, berdasarkan versi Python yang Anda gunakan. Lakukan pengujian akses jarak jauh di lingkungan jaringan yang sesuai sebelum menerapkan tugas.
Python 2
# _*_ coding: utf-8 _*_ # hanya untuk python2 import requests from urlparse import urlparse class HostHeaderSSLAdapter(requests.adapters.HTTPAdapter): def __init__(self, resolved_ip): super(HostHeaderSSLAdapter,self).__init__() self.resolved_ip = resolved_ip def send(self, request, **kwargs): connection_pool_kwargs = self.poolmanager.connection_pool_kw result = urlparse(request.url) if result.scheme == 'https' and self.resolved_ip: request.url = request.url.replace( 'https://' + result.hostname, 'https://' + self.resolved_ip, ) connection_pool_kwargs['assert_hostname'] = result.hostname request.headers['Host'] = result.hostname else: connection_pool_kwargs.pop('assert_hostname', None) return super(HostHeaderSSLAdapter, self).send(request, **kwargs) def access_url(url, resolved_ip): session = requests.Session() # Dapatkan bagian nama domain dari url parsed_url = urlparse(url) hostname = parsed_url.hostname session.mount('https://'+hostname, HostHeaderSSLAdapter(resolved_ip)) try: r = session.get(url) except Exception as e: print("err : "+ str(e)) else: if r.status_code != 200: print("not 200 " + ",resp : "+ r.text) else: print("success" + ",resp : "+ r.text) if __name__ == "__main__": # Ambil IP melalui perintah dig, perlu dig di lingkungan VPC # Pengujian alamat VPC # access_url("https://service.cn-shanghai-vpc.maxcompute.aliyun-inc.com", "100.103.104.45") # Pengujian alamat jaringan publik access_url("https://service.cn-shanghai.maxcompute.aliyun.com", "47.116.XX.XX")Python 3
# _*_ coding: utf-8 _*_ import requests from urllib.parse import urlparse class HostHeaderSSLAdapter(requests.adapters.HTTPAdapter): def __init__(self, resolved_ip): super().__init__() self.resolved_ip = resolved_ip def send(self, request, **kwargs): connection_pool_kwargs = self.poolmanager.connection_pool_kw result = urlparse(request.url) if result.scheme == 'https' and self.resolved_ip: request.url = request.url.replace( 'https://' + result.hostname, 'https://' + self.resolved_ip, ) connection_pool_kwargs['server_hostname'] = result.hostname # timpa header host request.headers['Host'] = result.hostname else: # header ini dari permintaan sebelumnya mungkin telah tersisa connection_pool_kwargs.pop('server_hostname', None) return super().send(request, **kwargs) def access_url(url, resolved_ip): session = requests.Session() # Dapatkan bagian nama domain dari url parsed_url = urlparse(url) hostname = parsed_url.hostname session.mount('https://'+hostname, HostHeaderSSLAdapter(resolved_ip)) try: r = session.get(url) except Exception as e: print("err : "+ str(e)) else: if r.status_code != 200: print("not 200 " + ",resp : "+ r.text) else: print("success" + ",resp : "+ r.text) if __name__ == "__main__": # Ambil IP melalui perintah dig, perlu dig di lingkungan VPC # Pengujian alamat VPC # access_url("https://service.cn-shanghai-vpc.maxcompute.aliyun-inc.com", "100.103.104.45") # Pengujian alamat jaringan publik access_url("https://service.cn-shanghai.maxcompute.aliyun.com", "47.116.XX.XX")
Hasil pengujian
Untuk mengakses layanan instance dalam jaringan VPC, konfigurasikan lingkungan Python di jaringan VPC, dan ganti tautan layanan serta alamat IP untuk pengujian.
Akses layanan MaxCompute secara lokal melalui jaringan publik.

Akses layanan MaxCompute pada instance Elastic Compute Service yang menjalankan Linux melalui jaringan publik.
