在 Linux 下,Swagger 本身不自带加密机制,所谓“Swagger 加密”通常指下面几种常见需求之一。你可以对照场景选择方案:
生产环境直接禁用 Swagger
Spring Boot 示例:
@Profile("!prod")
@Configuration
public class SwaggerConfig {
// 只在非 prod 环境启用
}
或:
spring:
profiles: active: prod
使用 Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**")
.authenticated()
.anyRequest().permitAll()
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService users() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user);
}
}
访问 Swagger 时会弹出登录框 ✅
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location /swagger-ui/ {
proxy_pass http://127.0.0.1:8080;
}
}
HTTP 自动跳转 HTTPS:
server {
listen 80;
return 301 https://$host$request_uri;
}
✅ 防止 Swagger 内容被中间人抓包
⚠️ Swagger 通常不负责业务数据加密
加密应在 接口层 / 数据层 做
location /swagger-ui/ {
allow 1.2.3.4;
deny all;
proxy_pass http://127.0.0.1:8080;
}
或 Linux iptables(不推荐):
iptables -A INPUT -p tcp --dport 8080 -s 1.2.3.4 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
✅ 不能也不应该加密
Swagger JSON 是文档协议,加密后前端无法解析
✅ 正确做法:
| 场景 | 推荐方案 |
|---|---|
| 生产环境 | ❌ 禁用 Swagger |
| 内部使用 | ✅ 账号密码 + IP 白名单 |
| 防止窃听 | ✅ HTTPS |
| 接口安全 | ✅ Token / 签名 |
| 文档保密 | ✅ 不加外网访问 |
如果你愿意,可以告诉我:
我可以直接给你一份可复制的完整配置。