All Products
Search
Document Center

MaxCompute:Akses layanan HTTPS menggunakan IP

Last Updated:Jun 19, 2025

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.com
  • Hasil yang dikembalikan dalam lingkungan Windows adalah sebagai berikut:

    tt

  • Hasil yang dikembalikan dalam lingkungan Linux adalah sebagai berikut:

    yy

Gunakan perintah dig

  1. 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-utils di konsol Linux untuk menginstal.

  2. Jalankan perintah berikut di konsol:

    dig service.cn-shanghai-vpc.maxcompute.aliyun-inc.com

    Hasil yang dikembalikan adalah sebagai berikut:

    Windows

    ppp

    Linux

    123h

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

null

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.

    fartestsss

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

    yyyrtqerewr