# Java 虚拟机

> 使用一个脚本在 macOS 上将 Proxyman 根 CA 证书安装到所有 Java KeyStore 中，使 Proxyman 能够抓包 Java 和 Kotlin 应用的 HTTPS 流量。

要拦截 Java 应用的 HTTPS 流量，你需要执行额外的步骤，将 Proxyman CA 证书安装到 Java KeyStore 中。例如，以下场景都需要这些步骤：

* 拦截来自单元测试（使用 Java 或 Kotlin 编写）的流量
* 拦截来自 Java 应用或 CLI 的流量

## 1. 优势 {#1-benefit}

* Proxyman 提供了一个脚本，只需点击一次即可自动将根证书安装到 Java KeyStore 中 ✅
* 支持 `$JAVA_HOME`
* 支持 `SDKMAN`
* 支持 `/usr/libexec/java_home`

## 2. 如何使用？ {#2-how-to-use}

### 1. 在 Mac 上安装 Proxyman CA {#1-install-proxyman-ca-on-your-mac}

在 Java 虚拟机上安装 Proxyman CA 之前，你必须先在 Mac 上正确安装它。

请参阅 macOS 指南：

- [macOS](https://proxyman.com/docs/zh-cn/debug-devices/macos)

如果你已经完成此步骤，可以跳过。

### 2. 将 Proxyman CA 安装到所有 Java KeyStore 中 {#2-install-proxyman-ca-to-all-java-key-stores}

* Certificate 菜单 -> Install Certificate on Java VMs -> Run Script...

![Proxyman Certificate 菜单，展开 Install Certificate on Java VMs 并高亮 Run Script](https://proxyman.com/docs/assets/proxyman-certificate-menu-java-run-script.jpg)

_运行 Java 证书脚本_

* 脚本会尝试从 **JAVA\_HOME**、**SDKMAN** 或 **$(/usr/libexec/java\_home)** 中查找 KeyStore 的位置，并在可能的情况下安装 CA 证书。

![Proxyman Java 脚本将证书安装到 Java cacerts KeyStore 中的终端输出](https://proxyman.com/docs/assets/Screenshot%202025-02-15%20at%2014.20.51.jpg)

_Proxyman 会将证书安装到其能找到的所有 Java 信任库中_

> **备注:** 该脚本位于 /Applications/Proxyman.app/Contents/Frameworks/ProxymanCore.framework/Versions/A/Resources/install-certificates-java.sh

> **备注:** 该脚本可能会请求自动化权限，因为 Proxyman 使用 [AppleScript](https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html) 以管理员权限在“终端”应用中运行它。

### 备选方案 {#alternative-solution}

* 如果你遇到以下错误，请参阅 @[**yauheniprakapenka**](https://github.com/yauheniprakapenka) 提供的解决方案：[https://github.com/ProxymanApp/Proxyman/issues/569#issuecomment-723588490](https://github.com/ProxymanApp/Proxyman/issues/569#issuecomment-723588490) 

`sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target`
