In the spirit of full transparency, development of this extension was assisted by LLM coding assistants. The assistant did most of the heavy lifting. As with any open-source tool, review the code to understand what it does before running it. That said, the code has been reviewed for potential issues.
OCISigner is a Burp Suite extension for signing OCI HTTP requests using API Key, Session Token, Config Profile (auto), Instance Principal (X.509), and Resource Principal (RPST) authentication methods. It supports SDK signing where possible and manual signing where the SDK is too restrictive for off-host use cases.
Requirements:
- Burp Suite (Montoya API compatible)
- Java 21+ for local builds (default minimum target is Java 21)
- Release artifacts may include JDK 25 builds; use a lower-target jar (for example JDK 21) if your Burp runtime is older.
- Download the latest release jar matching your runtime from:
- https://github.com/NetSPI/OCISigner/releases
- Example: use
*-jdk25.jarif Burp runs on Java 25; use*-jdk21.jarif Burp runs on Java 21.
- In Burp Suite, go to
Extensions->Installed->Add. - Set
Extension typetoJavaand select the downloaded jar.
- Build the extension:
mvn clean package
- In Burp Suite, go to
Extensions->Installed->Add. - Set
Extension typetoJavaand selecttarget/OCISigner-*-all.jar.
- In the OCISigner tab, pick an auth method, fill inputs, click Save.
- Optionally click Test Credentials to validate.
- Set Always Sign With to your profile and send requests in Repeater/Proxy.
- Toggle "Only sign in-scope requests" to only sign destinations set as in-scope in your Target tab
- Toggle "Update timestamp" to automatically update the timestsamp for any date or x-date headers
- Toggle "Only sign if Authorization exists" to only sign incoming HTTP requests that have an Authorization header. Helpful if you don't want ot sign requests going to other hosts that don't already have OCI auth.
- "Test Credentials" will send a GetNamespace (/n/) API request to the region supplied to validate the creds supplied are valid. Per OCI documentation here (shown below) GetNamespace does NOT REQUIRE AUTHORIZATION making it a good endpoint to validate creds are working regardless of permissions.
- Note: The Instance Profile authentication method is a bit of an exception. It will still call the /n/ API but will make a call to /v1/x509 before that call to generate the session token for future requests. Per the UI instructions you can point this to your current proxy to see that x509 request in your Logger tab when you click "Test Credentials".
Reference:
Behavior highlights:
- If both
dateandx-dateare present,x-datetakes precedence in the signing string. - Standard
PUT/POSTsigning includes body headers (x-content-sha256,content-type,content-length), including empty-bodyPUT/POST. - The Object Storage exception is limited to these
PUTAPIs only:PutObject:/n/{namespace}/b/{bucket}/o/{object}UploadPart:/n/{namespace}/b/{bucket}/u/{uploadId}/id/{partNumber}
- For those two Object Storage
PUTAPIs, minimum signed headers are(request-target),host, anddate/x-date. - For those two Object Storage
PUTAPIs:- If
x-content-sha256is present, it is signed. - If
content-lengthis present, it is signed. - If both are present, both are signed.
- Missing optional body headers (ex. x-content-sha256) are not added only because of this exception rule.
- If
- Config Profile import (Auto): Auto import checks
~/.oci/configonly. - Region save behavior: Region changes take effect after clicking Save.
- Config Profile region override: If a region is set in the profile UI, it overrides the region in the selected config profile.
- Proxy vs Repeater: Both are supported. If proxy traffic is not being signed, check:
- global
Signing Enabled Always Sign Withprofile selectionOnly sign in-scope requestsOnly sign if Authorization exists
- global
- Failure safety: If signing fails, OCISigner sends the original request unchanged.
Review the GitHub wiki for each profile auth method and how you would normally retrieve and use the credentials:
| Dependency | Where Used | Purpose |
|---|---|---|
net.portswigger.burp.extensions:montoya-api:2026.2 |
Burp extension entrypoint + UI panels + request hooks | Burp Suite extension API (UI, request handling, proxy integration). |
org.bouncycastle:bcprov-jdk18on:1.83 |
Key parsing + crypto primitives | PEM and RSA key handling for signing. |
org.bouncycastle:bcpkix-jdk18on:1.83 |
X.509 handling | Certificate parsing and chain handling for instance principal federation. |
com.oracle.oci.sdk:oci-java-sdk-shaded-full:3.81.0 |
SDK signing mode + config profile provider | Uses OCI SDK signing where feasible and reads OCI config profiles. |
com.fasterxml.jackson.core:jackson-databind:2.21.1 |
Token parsing + JWT helpers | JSON parsing for token responses and JWT claim extraction. |
org.junit.jupiter:junit-jupiter:6.0.3* |
Unit tests only | JUnit 5 test framework (unit tests and assertions). |
org.slf4j:slf4j-simple:2.0.17* |
Unit tests only | SLF4J binding to show logs during tests. |
*Test-scoped dependency.
The shaded OCI SDK embeds a large set of transitive libraries, including Jackson, Jersey, Apache HTTP Client, HK2, Jakarta/Javax APIs, SLF4J, commons-logging, and commons-codec.
The build relocates:
com.oracle.bmc -> com.webbinroot.ocisigner.shadow.com.oracle.bmc
This avoids classloader conflicts with other Burp extensions.
- Tokens and private keys are sensitive. Avoid sharing logs that include them.
- Use the token masking features in the UI when demonstrating or screen-sharing.

