Ana içeriğe geç

SSL/TLS ile Apinizer Modüllerini Başlatma

Yapılandırma Adımları​

Sertifika Hazırlığı

Sertifikaları hazırlayın:

  • SSL/TLS sertifikası oluşturun veya temin edin
  • Private key'i hazırlayın
  • Certificate chain'i hazırlayın (gerekirse)
not

Sertifikaların geçerli olması ve güvenilir bir sertifika otoritesi tarafından imzalanmış olması önerilir.

Sertifika Formatı Dönüşümü

Gerekirse sertifika formatını JKS formatına dönüştürün:

  • PFX'ten JKS'e dönüştürme
  • PEM'den JKS'e dönüştürme
ipucu

Sertifika dönüşüm işlemleri için PFX JKS Dönüştürme sayfasına bakabilirsiniz.

Kubernetes Secret Oluşturma

Sertifikaları Kubernetes secret olarak oluşturun:

kubectl create secret tls apinizer-tls \
--cert=certificate.crt \
--key=private.key \
-n apinizer
uyarı

Secret oluştururken sertifika ve private key dosyalarının doğru yollarını belirttiğinizden emin olun.

Deployment Yapılandırması

Deployment yapılandırmasında SSL ayarlarını yapın:

env:
- name: SSL_ENABLED
value: "true"
- name: SSL_KEY_STORE
value: "/etc/ssl/certs/keystore.jks"
- name: SSL_KEY_STORE_PASSWORD
valueFrom:
secretKeyRef:
name: apinizer-tls
key: password
- name: SERVER_PORT
value: "8443"
bilgi

SSL ayarları environment variable'lar üzerinden yapılandırılır. Keystore dosyasının pod içinde erişilebilir bir konumda olması gerekir.

API Manager SSL Yapılandırması​

Sertifika Yükleme​

Öncelikle, .p12 uzantılı sertifika dosyanızı Kubernetes'e bir secret olarak yükleyiniz.

kubectl create secret generic manager-tls --from-file=manager.p12 -n apinizer

Sertifika Alias'ını Bulma​

Bir sertifikanın Alias'ını bulmak için:

keytool -list -v -keystore manager.p12 -storetype PKCS12

JKS'den PKCS12 Oluşturma​

JKS formatındaki sertifikayı PKCS12 formatına dönüştürmek için:

keytool -genkeypair -alias <ALIAS> -keyalg RSA -keysize 4096 -storetype PKCS12 -keystore manager.p12 -validity 3650 -storepass <PASSWORD>
ipucu

Uzantısı .p12 olan dosyanızı /etc/ssl/certs dizinine ekleyiniz.

Gerekli Ortam Değişkenleri​

Deployment yaml tanımında olması gereken değişkenler:

DeğişkenAçıklama
SSL_KEY_STORESSL sertifikasını içeren anahtar deposunun yolu. Örneğimizde, Spring Boot'un bunu classpath'te aramasını istiyoruz.
SSL_KEY_STORE_PASSWORDAnahtar deposuna erişmek için kullanılan şifre.
SSL_KEY_STORE_TYPEAnahtar deposunun türü (Kullanım: PKCS12).
SSL_KEY_ALIASAnahtar deposundaki anahtarı tanımlayan takma ad.
SSL_ENABLEDSpring Boot uygulamasının HTTPS protokolünü kullanmasını sağlar.
SERVER_PORTSunucunun dinlediği port. 8443 kullanılmalıdır.

Örnek API Manager Deployment Dosyası​

Örnek bir API Manager deployment dosyası:

apiVersion: apps/v1
kind: Deployment
metadata:
name: manager
namespace: apinizer
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: manager
version: v1
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 75%
type: RollingUpdate
template:
metadata:
labels:
app: manager
version: v1
spec:
automountServiceAccountToken: true
volumes:
- name: manager-tls
secret:
secretName: manager-tls
containers:
- env:
- name: JAVA_OPTS
value: ' -XX:MaxRAMPercentage=75.0 -Dlog4j.formatMsgNoLookups=true'
- name: LOGGING_LEVEL_ROOT
value: INFO
- name: LOGGING_LEVEL_com_apinizer_manager
value: INFO
- name: SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE
value: 20MB
- name: SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE
value: 50MB
- name: SPRING_PROFILES_ACTIVE
value: prod
- name: SSL_KEY_STORE
value: /etc/ssl/manager.p12
- name: SSL_KEY_STORE_PASSWORD
value: <PASSWORD>
- name: SSL_KEY_STORE_TYPE
value: PKCS12
- name: SSL_KEY_ALIAS
value: <ALIAS>
- name: SSL_ENABLED
value: "true"
- name: SERVER_PORT
value: "8443"
- name: SPRING_DATA_MONGODB_URI
valueFrom:
secretKeyRef:
key: dbUrl
name: mongo-db-credentials
- name: SPRING_DATA_MONGODB_DATABASE
valueFrom:
secretKeyRef:
key: dbName
name: mongo-db-credentials
volumeMounts:
- name: manager-tls
mountPath: /etc/ssl/
image: apinizercloud/manager:<APINIZER_VERSION>
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- sleep 10
livenessProbe:
failureThreshold: 3
httpGet:
path: /apinizer/management/health
port: 8443
scheme: HTTPS
initialDelaySeconds: 120
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 30
name: manager
ports:
- containerPort: 8443
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /apinizer/management/health
port: 8443
scheme: HTTPS
initialDelaySeconds: 120
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 30
resources:
limits:
cpu: 1
memory: 3Gi
securityContext:
allowPrivilegeEscalation: true
readOnlyRootFilesystem: false
runAsGroup: 0
runAsNonRoot: false
runAsUser: 0
startupProbe:
failureThreshold: 3
httpGet:
path: /apinizer/management/health
port: 8443
scheme: HTTPS
initialDelaySeconds: 90
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 30
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
---
apiVersion: v1
kind: Service
metadata:
name: manager
namespace: apinizer
labels:
app: manager
spec:
selector:
app: manager
type: NodePort
ports:
- name: http
port: 8443
targetPort: 8443
nodePort: 32843

Sertifika Oluşturma​

Kendi sertifikanızı oluşturmak için uygulanacak adımlar:

Private Key Oluşturma

openssl genrsa -out server.key 2048

CSR (Certificate Signing Request) Oluşturma

openssl req -new -key server.key -out server.csr

İmzalı Sertifika Oluşturma

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

PKCS#12 Formatına Dönüştürme

openssl pkcs12 -export -out manager.p12 -inkey server.key -in server.crt

İlgili Kaynaklar​