Pemecahan masalah NextPDF Gotenberg
Sekilas
Bagian berjudul “Sekilas”Bridge gagal secara eksplisit dan sedini mungkin. Setiap kegagalan melempar pengecualian bertipe dengan pesan yang menyebutkan penyebabnya. Gunakan halaman ini sebagai katalog. Untuk setiap kegagalan, Anda akan melihat tipe pengecualian, fragmen pesan yang muncul, pemicu pastinya pada jalur kode, dan perbaikannya.
Keluarga pengecualian tersebut adalah:
GotenbergConvertException— kegagalan pada lapisan konversi (konfigurasi, transport, atau respons).RuntimeException— kegagalan pada lapisan validasi yang dilempar oleh kebijakan keamanan sebelum lalu lintas jaringan terjadi.ValueError— ekstensi berkas yang tidak dikenali.InvalidSpkiPinException— string pin Transport Layer Security (TLS) SubjectPublicKeyInfo (SPKI) dengan format yang salah.
Kegagalan konfigurasi
Bagian berjudul “Kegagalan konfigurasi””Konfigurasi Gotenberg tidak valid: apiUrl kosong”
Bagian berjudul “”Konfigurasi Gotenberg tidak valid: apiUrl kosong””- Tipe:
GotenbergConvertException - Pemicu: Anda memanggil
convertFile()atauconvertString()ketikaGotenbergConfig::isValid()bernilai false. Ini terjadi ketikaapiUrladalah string kosong. - Perbaikan: Sediakan URL HTTPS yang tidak kosong. Jika Anda membangun konfigurasi dengan
fromArray(), perhatikan bahwa metode itu secara diam-diam mengisi''untukapi_urlyang hilang atau bukan string. Validasi sumber konfigurasi Anda saat boot.
Kegagalan URL dan alamat (SSRF)
Bagian berjudul “Kegagalan URL dan alamat (SSRF)”Kegagalan ini berasal dari kebijakan keamanan, yang melindungi dari server-side request forgery (SSRF). Bridge memunculkannya sebelum mengirim permintaan apa pun. Masing-masing berupa RuntimeException biasa.
”URL API Gotenberg harus menggunakan HTTPS (didapat: http)”
Bagian berjudul “”URL API Gotenberg harus menggunakan HTTPS (didapat: http)””- Pemicu: Skema URL yang dikonfigurasi bukan
https. Pemeriksaan tidak membedakan huruf besar-kecil, jadiHTTPS://diterima. - Perbaikan: Tempatkan Gotenberg di belakang TLS dan konfigurasikan endpoint HTTPS. HTTP biasa ditolak bahkan untuk pengembangan lokal.
”URL API Gotenberg tidak valid: tidak dapat diuraikan”
Bagian berjudul “”URL API Gotenberg tidak valid: tidak dapat diuraikan””- Pemicu: URL tidak dapat diuraikan menjadi skema dan host.
- Perbaikan: Berikan URL absolut yang valid secara sintaksis, misalnya
https://gotenberg.example.com:3000.
”URL API Gotenberg tidak boleh me-resolve ke alamat IP privat atau yang dicadangkan”
Bagian berjudul “”URL API Gotenberg tidak boleh me-resolve ke alamat IP privat atau yang dicadangkan””- Pemicu: Host berupa literal Internet Protocol (IP) privat atau yang dicadangkan, atau nama host yang me-resolve (melalui semua rekaman A/AAAA) ke alamat privat atau alamat yang dicadangkan mana pun. Ini memblokir rentang privat dari Request for Comments (RFC) 1918, loopback, dan alamat link-local.
- Perbaikan: Arahkan bridge ke alamat publik yang routable atau alamat layanan yang tersegmentasi dengan benar. Jika Gotenberg Anda memang sengaja berada di jaringan privat, pelindung SSRF bridge menolaknya secara desain. Ekspos melalui alamat yang diterima pelindung, lalu lindungi jalur tersebut dengan kontrol jaringan dan autentikasi. Lihat /integrations/gotenberg/security-and-operations/.
”Jawaban DNS URL API Gotenberg berubah sejak validasi — kemungkinan serangan DNS rebinding”
Bagian berjudul “”Jawaban DNS URL API Gotenberg berubah sejak validasi — kemungkinan serangan DNS rebinding””- Pemicu: Di antara validasi awal dan permintaan, resolusi Domain Name System (DNS) terbaru mengembalikan alamat yang tidak ada dalam kumpulan alamat yang semula divalidasi.
- Perbaikan: Ini adalah pelindung time-of-check/time-of-use yang aktif. Selidiki DNS untuk host tersebut. Penyebab yang sah adalah load balancer yang merotasi alamat. Penyebab yang berbahaya adalah serangan rebinding. Gunakan alamat yang stabil atau nama dengan kumpulan rekaman yang stabil untuk endpoint Gotenberg.
Kegagalan validasi input
Bagian berjudul “Kegagalan validasi input”Kebijakan keamanan memunculkan kegagalan ini sebelum permintaan dikirim. Masing-masing berupa RuntimeException biasa kecuali dinyatakan lain.
”Berkas tidak ditemukan atau tidak dapat dibaca: ”
Bagian berjudul “”Berkas tidak ditemukan atau tidak dapat dibaca: ””- Tipe:
GotenbergConvertException - Pemicu:
convertFile()tidak dapat melakukan kanonikalisasi pada path, atau path yang di-resolve bukan berkas reguler yang dapat dibaca. Direktori juga memicu ini. - Perbaikan: Berikan path ke berkas yang ada dan dapat dibaca. Path dikanonikalisasi dengan
realpath()terlebih dahulu, yang sekaligus menggagalkan traversal.
”Ukuran berkas ( byte) melebihi ukuran maksimum yang diizinkan ( byte)”
Bagian berjudul “”Ukuran berkas ( byte) melebihi ukuran maksimum yang diizinkan ( byte)””- Pemicu: Input lebih besar daripada
maxFileSize(standar 52.428.800 byte = 50 MiB). - Perbaikan: Naikkan
maxFileSizejika dokumen memang membutuhkannya secara sah, atau tolak unggahan di hulu. Pertahankan batas serendah mungkin yang masih mengakomodasi dokumen nyata Anda. Ini adalah satu-satunya batas sumber daya bawaan bridge.
Penolakan nama berkas
Bagian berjudul “Penolakan nama berkas”Bridge memvalidasi nama berkas. Untuk konversi berkas, nama berkas adalah basename dari path yang di-resolve; untuk convertString(), nama tersebut adalah nama yang Anda berikan. Masing-masing berupa RuntimeException:
| Fragmen pesan | Pemicu |
|---|---|
must not be empty | nama berkas kosong |
path traversal sequences (..) | nama mengandung .. |
forward slashes | nama mengandung / |
backslashes | nama mengandung \ |
null bytes | nama mengandung byte NUL |
control characters | nama mengandung karakter kontrol ASCII (0–31) |
- Perbaikan: Berikan basename yang bersih. Untuk
convertString(), berikan nama biasa sepertireport.docx. Nama tersebut digunakan untuk deteksi format dan sebagai nama berkas unggahan multipart, bukan sebagai path.
”Ekstensi format office tidak dikenal: ”
Bagian berjudul “”Ekstensi format office tidak dikenal: ””- Tipe:
ValueError - Pemicu: Ekstensi berkas bukan salah satu dari
docx,xlsx,pptx,odt,ods,odp(tidak peka huruf besar-kecil, titik di depan ditoleransi). - Perbaikan: Konversikan hanya enam format yang dikenali. Bridge tidak mengenali format biner lawas (
.doc,.xls,.ppt),.rtf,.csv, teks biasa, atau gambar. Konversikan input ini ke format yang dikenali sebelum Anda memanggil bridge, atau arahkan melalui jalur lain.
Kegagalan transport dan respons
Bagian berjudul “Kegagalan transport dan respons”Semua ini berupa GotenbergConvertException.
”Permintaan HTTP Gotenberg gagal: ”
Bagian berjudul “”Permintaan HTTP Gotenberg gagal: ””- Pemicu: Klien PHP Standard Recommendation 18 (PSR-18) (atau transport cURL ber-pin) melempar pengecualian saat mengirim permintaan. Penyebabnya adalah penolakan koneksi, batas waktu, kegagalan handshake TLS, atau ketidakcocokan pin.
- Kode pengecualian: kode pengecualian klien yang mendasarinya.
- Penyebab: pengecualian klien PSR-18 asli dilampirkan sebagai pengecualian sebelumnya.
- Perbaikan: Periksa empat hal. Periksa keterjangkauan layanan dengan
isAvailable(). Periksa jalur jaringan. Periksa rantai TLS. Jika pinning dikonfigurasi, pastikan SubjectPublicKeyInfo (SPKI) server saat ini cocok dengan pin yang dikonfigurasi. Ketidakcocokan pin setelah rotasi sertifikat adalah penyebab klasiknya. Lihat prosedur rotasi di /integrations/gotenberg/security-and-operations/.
”Galat transport cURL (): ”
Bagian berjudul “”Galat transport cURL (): ””- Pemicu:
curl_execdari transport cURL ber-pin gagal dengan nomor galat cURL bukan nol, atau mengembalikan body yang bukan string. - Perbaikan: Nomor galat cURL menunjukkan penyebabnya (TLS, resolve, batas waktu, pin). Kegagalan pinning muncul di sini ketika
CURLOPT_PINNEDPUBLICKEYmenolak sertifikat. Pastikan bahwa pin yang dikonfigurasi dan alamat yang di-resolve sudah terkini.
”Konversi Gotenberg gagal dengan HTTP : ”
Bagian berjudul “”Konversi Gotenberg gagal dengan HTTP : ””- Pemicu: Status respons bukan
200. Body disertakan, dipangkas hingga 500 karakter pertama, dengan elipsis ditambahkan jika lebih panjang. - Perbaikan: Baca body yang disertakan. Pesan galat Gotenberg menjelaskan mengapa konversi ditolak: konten dokumen yang tidak didukung, kegagalan LibreOffice internal, atau penolakan autentikasi pada
401atau403.401/403berartiapiKeyhilang atau salah.5xxadalah kegagalan di sisi layanan dan merupakan kandidat untuk percobaan ulang yang dibatasi.
”Content-Type tak terduga dari Gotenberg: (diharapkan application/pdf)”
Bagian berjudul “”Content-Type tak terduga dari Gotenberg: (diharapkan application/pdf)””- Pemicu: Statusnya
200, tetapiContent-Typerespons tidak memuatapplication/pdf. - Perbaikan: Ini biasanya berarti sebuah proxy atau gateway mengembalikan halaman galat HTML atau halaman pengalihan dengan
200. Bridge sengaja menonaktifkan pengikutan pengalihan pada transport ber-pin, sehingga respons3xxtidak diikuti secara diam-diam ke host yang belum diperiksa. Body yang tiba denganContent-Typeyang salah menandakan bahwa ada sesuatu di antara Anda dan Gotenberg yang mengganggu. Periksa jalur jaringan.
”Body respons tidak diawali dengan header %PDF — data PDF tidak valid”
Bagian berjudul “”Body respons tidak diawali dengan header %PDF — data PDF tidak valid””- Pemicu: Status
200,Content-Typedapat diterima, tetapi body tidak diawali dengan tanda tangan%PDF. - Perbaikan: Pihak hulu mengembalikan sesuatu yang bukan berkas Portable Document Format (PDF) meskipun header-nya sesuai. Perlakukan respons sebagai tidak tepercaya dan selidiki layanan tersebut. Jangan tulis body ke disk. Bridge menolak mengembalikannya sebagai hasil.
Kegagalan konfigurasi pin
Bagian berjudul “Kegagalan konfigurasi pin””Format pin SPKI tidak valid: (diharapkan sha256/)”
Bagian berjudul “”Format pin SPKI tidak valid: (diharapkan sha256/)””- Tipe:
InvalidSpkiPinException - Pemicu: Salah satu string pin yang dikonfigurasi tidak diawali dengan
sha256/atausha256//. - Perbaikan: Format setiap pin sebagai
sha256/<base64-encoded-spki-hash>. Transport juga menerima bentuk asli cURLsha256//<base64>. Hasilkan nilai dari SubjectPublicKeyInfo sertifikat server, bukan dari keseluruhan sertifikat.
”Tertulis tidak tersedia padahal layanan aktif”
Bagian berjudul “”Tertulis tidak tersedia padahal layanan aktif””isAvailable() mengembalikan false tanpa panggilan jaringan apa pun ketika URL kosong, bukan HTTPS, atau me-resolve ke alamat private/reserved. Metode itu juga mengembalikan false pada galat jaringan apa pun, atau ketika /health mengembalikan 500 atau lebih; dalam kasus tersebut, metode ini menangkap galat alih-alih melemparkannya. Periksa secara berurutan:
- URL yang dikonfigurasi tidak kosong dan menggunakan HTTPS.
- Host tidak me-resolve ke alamat private/reserved (pelindung SSRF menolaknya bahkan untuk probe).
<apiUrl>/healthdapat dijangkau dari host aplikasi dan mengembalikan status di bawah500.
Lihat juga
Bagian berjudul “Lihat juga”- /integrations/gotenberg/configuration/ — semua opsi dan aturan pemilihan transport.
- /integrations/gotenberg/production-usage/ — kebijakan percobaan ulang dan kontrak penanganan kegagalan.
- /integrations/gotenberg/security-and-operations/ — model SSRF dan rotasi pin.
- /integrations/gotenberg/quickstart/ — urutan catch lengkap dalam konteks.