JavaScript Springboot Cloudflare'de bağlantıları engelliyor

706111

Hectopat
Katılım
28 Ağustos 2023
Mesajlar
6.020
Makaleler
1
Çözümler
29
Arkadaşlar merhaba. React ve Springboot ile bir web sitesi yaptım kendime. İlgili çıktıları aldım ve sunucuda güzel bir şekilde çalıştırdım. Admin panelimde içerikler ekliyorum, sitemde gözüküyor güzel.

Daha sonra Brave dediki, "bu site güvenli değil". Ben de Cloudflare'ye sunucumu, alan adının DNS'lerine de Cloudflare ekledim.
Cloudflare'den SSL/TLS ayarı default olarak "flexiable" idi. Ondan Springboot izin vermedi bağlantılar, blokladı. "Full' de ise site açılmıyor. Ben de "Off" seçeneği ile kullamıyorum ama "güvenli değil" hatası veriyor Brave. Ayrıca telefondan da siteye eriştiğimiz zaman veri tabanı ile bağlantı kurmuyor.

İlgili kodlarım;

Controller.java
Java:
package com.tensa.proje.controller;

import java.util.List;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.tensa.proje.entityDTO.ContentDTO;
import com.tensa.proje.service.ContentService;

import lombok.AllArgsConstructor;

@RestController
@RequestMapping("/api/content")
@AllArgsConstructor
public class ContentController {

    private ContentService service;
 
    @GetMapping("{id}")
    public ResponseEntity<?> getContent(@PathVariable("id") Long id) {
   
   
        ContentDTO contentDTO = service.getContent(id);
   
        if(contentDTO != null) {
       
            return ResponseEntity.ok(contentDTO);
        }else {
       
            return new ResponseEntity<>
            ( "Not found content by id: "+ id, HttpStatus.NOT_FOUND);
        }
   
    }
 
    @PostMapping
    public ResponseEntity<?> createContent(@RequestBody ContentDTO content){
   
        ContentDTO contentDTO = service.createContent(content);
   
        if(contentDTO != null) {
       
            return ResponseEntity.ok(contentDTO);
        }else {
            return new ResponseEntity<>("Not crate content", HttpStatus.BAD_REQUEST);
        }
   
   
    }
 
    @GetMapping
    public ResponseEntity<?> getContents(){
   
        List<ContentDTO> contents = service.contents();
   
        if(contents != null) {
            return ResponseEntity.ok(contents);
        }else {
            return new ResponseEntity<>
            ( "Conttens Not Found", HttpStatus.NOT_FOUND);
        }
   
   
    }
 
    @PutMapping("{id}")
    public ResponseEntity<?> updateContent(@PathVariable("id") Long id,
            @RequestBody ContentDTO contentDTO){
   
        ContentDTO content = service.updateContent(id, contentDTO);
   
        if(content != null) {
            return ResponseEntity.ok(content);
        }else {
            return new ResponseEntity<>
            ( "Conttens Not Found", HttpStatus.NOT_FOUND);
        }
    }
 
    @DeleteMapping("{id}")
    public void deleteContent(@PathVariable("id") Long id) {
   
        service.deleteContent(id);
 
    }
   
 
}

WebConfig.java
Java:
package com.tensa.proje.controller;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer{
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
 
}

Application.yaml
YAML:
spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:file:./dataBase
    username: root
    password: 1234
  http:
    encoding:
    force: true
    charset: UTF-8
    enabled: true
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true

React: Service.js
Kod:
import React from 'react';
import axios from 'axios';
import Base from 'antd/es/typography/Base';


const BASE_URL = 'https://xxx.x.x.xxx:8080/api/content';

export const listContents = () => axios.get(BASE_URL);

Tarayıcının verdiği hata;
"Failed to load resource: net::ERR_SSL_PROTOCOL_ERROR https://xxx.x.x.xxx:8080/api/content"

Arkadaşlar eğer Service.js'in adresini "http://" ile başlatırsam da bu hatayı veriyor;
" GET http://xxx.xxx.xxx.xxx:8080/api/content net::ERR_FAILED 500"

Başka bir hata yok. (kusura bakmayın IP adresini gizlemem gerekiyor).

@bitwise @count

@Lordxe
 
Son düzenleme:
Oncelikle konunun backend ile alakali olup olmadigini cozmek icin testler yapman gerek.

SSL yonlendirmesi aktif mi?

Google'dan ornek veriyorum, 301 veriyor dogru sekilde. ( 302 de olur )
1722811108422.png


443 portu acik mi?

1722811170289.png


Eger sunucuna domain uzerinden direkt 8080 portundan eriseceksen o port acik mi? Acik ise, o port uzerinden SSL resolve yapacak sistem kurulu mu? Ornegin google 8080 den dinlemiyor.

1722811580130.png


Spring default 8080 portunda calisiyorsa, 443'e gelen istekleri karsilayip SSL resolve yapacak ve senin spring backend'ine reverse proxy atacak setup kurulu mu?

Bunu Cloudflare default saglamiyor olabilir, bilmiyorum. Biz nginx kullaniyoruz bu islem icin.

"net::ERR_FAILED 500" --> Buradaki 500 hatasini Spring atiyorsa ( ki oyle muhtemelen ) o halde loglardan incelemelisin problemi. Guvenlik sebebiyle 500 atmaz. 401 ya da 403 beklerim guvenlik sebebiyle atilacak hatada.

Tavsiyem, kendine test amacli ucuz bir cloud sunucu kiralayip Nginx ( ya da Apache ) ile SSL konfigurasyonunu halletmen. Boylelikle aradaki gecis netlesir.

Ref -> Securing HTTP Traffic to Upstream Servers | NGINX Documentation

Client ---> Nginx blogu: ( ---> SSL_RESOLVE ---> Reverse Proxy ) ---> Backend Cluster [Spring]: ( ---> Request & Response ) seklinde bir akis var.
 
Oncelikle konunun backend ile alakali olup olmadigini cozmek icin testler yapman gerek.

SSL yonlendirmesi aktif mi?

Google'dan ornek veriyorum, 301 veriyor dogru sekilde. ( 302 de olur )
Eki Görüntüle 2274314

443 portu acik mi?

Eki Görüntüle 2274315

Eger sunucuna domain uzerinden direkt 8080 portundan eriseceksen o port acik mi? Acik ise, o port uzerinden SSL resolve yapacak sistem kurulu mu? Ornegin google 8080 den dinlemiyor.

Eki Görüntüle 2274320

Spring default 8080 portunda calisiyorsa, 443'e gelen istekleri karsilayip SSL resolve yapacak ve senin spring backend'ine reverse proxy atacak setup kurulu mu?

Bunu Cloudflare default saglamiyor olabilir, bilmiyorum. Biz nginx kullaniyoruz bu islem icin.

"net::ERR_FAILED 500" --> Buradaki 500 hatasini Spring atiyorsa ( ki oyle muhtemelen ) o halde loglardan incelemelisin problemi. Guvenlik sebebiyle 500 atmaz. 401 ya da 403 beklerim guvenlik sebebiyle atilacak hatada.

Tavsiyem, kendine test amacli ucuz bir cloud sunucu kiralayip Nginx ( ya da Apache ) ile SSL konfigurasyonunu halletmen. Boylelikle aradaki gecis netlesir.

Ref -> Securing HTTP Traffic to Upstream Servers | NGINX Documentation

Client ---> Nginx blogu: ( ---> SSL_RESOLVE ---> Reverse Proxy ) ---> Backend Cluster [Spring]: ( ---> Request & Response ) seklinde bir akis var.
Hocam ben de Nginx kurdum onu kullanıyorum. Diğerleri için hemen okuyorum yazdıklarınızı. Dönüş yapacağım, sağ olun.

Hocam curl -I çıktısı
Bash:
HTTP/2 301
date: Sun, 04 Aug 2024 22:50:10 GMT
content-type: text/html
content-length: 167
location: http://.com/
cache-control: max-age=3600
expires: Sun, 04 Aug 2024 23:50:10 GMT
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=aH                               gUcLazcjPg%2F9YgNizkTKhhBt6JPjeTk8g2MJc916gAZC7JHegpy%2BT%2BRt5nhBnajbRCg0gUr%2F                               VMRxE2yW21eVD3hotma%2BIiTg7wOBgEXlUpetnTOkuEiJJDlccMOg%3D%3D"}],"group":"cf-nel"                               ,"max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 8ae21ad65b5cb9c9-OTP

nc -z -v -w 1 komut;
nc -z -v -w 1 siteadi.com 443
Connection to siteadi.com (172.67.142.68) 443 port [tcp/https] succeeded!


Hocam ngnix 80 portundan dinliyor. Config'i bu;
Bash:
server {
    listen 80;
    server_name siteadi.com;

    location / {
        root /var/www/html;
        try_files $uri /index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8080/;
    }
}

location /api/ yazan kısmı da Springboot Api'leri için Chat GPT önermişti.

Hocam VDS server da kullanıyorum ben. Cloud server ile VDS başka kavramlar mı?
 
Son düzenleme:
Hocam ngnix 80 portundan dinliyor. Config'i bu;

443 portundan kim dinliyor peki? Oraya baglanabilmissin.

Nginx 80 portundan baglanilana reverse proxy yapiyor fakat 443 deki arkadas nereye reverse edecegini biliyor mu?

Ayrica nginx config'lerinde localhost:8080 e reverse proxy ediyor, spring backend'i ile nginx ayni fiziksel makinede mi?

Soyle bir adrese girip SSL sertifikani kontrol eder misin -> SSL Checker

Burasi sertifikanin valid sekilde resolve olup olmadigini soyleyecek. Olsa bile birilerinin 443'e gelen client'i senin spring backendine yonlendirmesi gerekiyor.
 
443 portundan kim dinliyor peki? Oraya baglanabilmissin.

Nginx 80 portundan baglanilana reverse proxy yapiyor fakat 443 deki arkadas nereye reverse edecegini biliyor mu?

Ayrica nginx config'lerinde localhost:8080 e reverse proxy ediyor, spring backend'i ile nginx ayni fiziksel makinede mi?

Soyle bir adrese girip SSL sertifikani kontrol eder misin -> SSL Checker

Burasi sertifikanin valid sekilde resolve olup olmadigini soyleyecek. Olsa bile birilerinin 443'e gelen client'i senin spring backendine yonlendirmesi gerekiyor.
Hocam 443'te kimin ne dinlediğini bulamadım.

Ngnix 80 portu ile 443 arasında otomatik olarak bir şey yoksa bunların biribirini tanıyacağı bir ayar yapmadım ben.

Spring backend ile nginx aynı makineye kurulu hıcam. SSL Checker valid olduğunu bildirdi. Birkaç sitede de "Successfully validated certificate chain."
bilgisi verdi.
 
Son düzenleme:
Hocam 443'te kimin ne dinlediğini bulamadım.

Ngnix 80 portu ile 443 arasında otomatik olarak bir şey yoksa bunların biribirini tanıyacağı bir ayar yapmadım ben.

Spring backend ile nginx aynı makineye kurulu hıcam. SSL Checker valid olduğunu bildirdi. Birkaç sitede de "Successfully validated certificate chain."
bilgisi verdi.

O halde 443'u dinleyen component'in dogru yonlendirme yapmamasi sorun.

Sen kendi web sitene https://biseyler.com uzerinden ulastiginda SSL hatasi almiyorsun ( SSL cert valid olduguna gore ) fakat direkt IP uzerinden https://129.214.x.x:8080 yaptiginda SSL hatasi aliyorsun cunku resolver orada degil.

Nginx de otomatik ayar yok, 80 i dinledigi gibi 443 u de dinleyip SSL resolve etmesini soylemen gerekiyor. Ama senin durumda birileri zaten SSL resolve etmis o yuzden bu adima gerek yok. Cloudflare'de SSL resolve eden yer neresiyse onu konfigure etmen gerekiyor. Malesef ben hic kullanmadim cloudflare ve muhtemelen kendim arastirarak senin arastirarak bulacagindan fazlasina ulasamayacagim.
 
O halde 443'u dinleyen Component'in dogru yonlendirme yapmamasi sorun.

Sen kendi web sitene https://biseyler.com uzerinden ulastiginda SSL hatasi almiyorsun ( SSL cert valid olduguna gore ) fakat direkt IP uzerinden https://129.214.x.x:8080 yaptiginda SSL hatasi aliyorsun cunku resolver orada degil.

Nginx de otomatik ayar yok, 80'i dinledigi gibi 443'u de dinleyip SSL Resolve etmesini soylemen gerekiyor. Ama senin durumda birileri zaten SSL Resolve etmis o yuzden bu adima gerek yok. Cloudflare'de SSL Resolve eden yer neresiyse onu konfigure etmen gerekiyor. Maalesef ben hiç kullanmadim Cloudflare ve muhtemelen kendim arastirarak senin arastirarak bulacagindan fazlasina ulasamayacagim.

Hocam o zaman ben de direkt Cloudflare'yi kaldirayim. Bir muddet boyle olsun. Bir de Server'a format atip, Nginx'i tekrar yukleyim.

Her seyi sifirdan adim adim yapim.
 
Hocam o zaman ben de direkt Cloudflare'yi kaldirayim. Bir muddet boyle olsun. Bir de Server'a format atip, Nginx'i tekrar yukleyim.

Her seyi sifirdan adim adim yapim.

Eger oyle bir fikrin varsa SSL isini nginx'e yukleyip deneyebilirsin. Once nginx yukle, 80 portundan ulasabildigine emin ol. Sonra SSL cert yukleyip 443 portundan ulasabildigine emin ol. Sonra DNS ayarlari yapip https://biseyler.com uzerinden ulasip default nginx sayfasini gormen gerekiyor.

Buraya kadar her sey OK ise tek yapman gereken ayni makinede spring'i calistirip 8080 'e reverse proxy atmak.
 
Eger oyle bir fikrin varsa SSL isini nginx'e yukleyip deneyebilirsin. Once nginx yukle, 80 portundan ulasabildigine emin ol. Sonra SSL cert yukleyip 443 portundan ulasabildigine emin ol. Sonra DNS ayarlari yapip https://biseyler.com uzerinden ulasip default nginx sayfasini gormen gerekiyor.

Buraya kadar her sey OK ise tek yapman gereken ayni makinede spring'i calistirip 8080 'e reverse proxy atmak.
Hocam nasıl terslenir bilmiyorum. Cloudflare'yi sıfırladım ve Let's SSL diye bir şey varmış ondan yaptım.

Siteye ulaşıyorum ama vt bağlantısı yapmıyor. Normal postman ile Get, Post yapınca IP adresinden çalışıyor.

NGINX yapılandırması bu;
NGINX:
server {
    server_name biseyler.com;

    location / {
        root /var/www/html;
        try_files $uri /index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8080/;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/biseyler.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/biseyler.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = biseyler.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name biseyler.com;
    return 404; # managed by Certbot


}

Hocam bu sefer biraz araştırma yaptım. Keytool ile anahtar oluşturdum, yaml dosyasına ilgili ayarları ekledim. Site güvenli gözüküyor, HTTPS ile giriyor.

Lakin site açılıyor ama Console'da "Failed to load resource: Net: ERR_CERT_AUTHORITY_INVALID" hatası veriyor.

Diğer yandan postman ile HTTPS ile CRUD işlemleri rahatlıkla oluyor.

@bitwise hocam. Sanırım bu istekleri aslında kendim filtreden geçirmem gerekiyor. Spring Security'de gördüm. Otomatik Config ayarı olduğu için Springboot'ta, gelen istekleri engelleyip hata gönderiyor büyük ihtimalle.

@bitwise hocam. Sanırım bu istekleri aslında kendim filtreden geçirmem gerekiyor. Spring Security'de gördüm. Otomatik Config ayarı olduğu için Springboot'ta, gelen istekleri engelleyi
 
Son düzenleme:

Technopat Haberler

Yeni konular

Geri
Yukarı