[GH-ISSUE #978] Trouble SSL proxying iOS device through ProxyMan #973

Closed
opened 2026-03-03 19:23:27 +03:00 by kerem · 9 comments
Owner

Originally created by @mlaster on GitHub (Sep 7, 2021).
Original GitHub issue: https://github.com/ProxymanApp/Proxyman/issues/978

Originally assigned to: @NghiaTranUIT on GitHub.

I'm evaluating ProxyMan as a replacement for Charles Proxy. Charles works, but I've always hated the interface. If I can get ProxyMan to do the same thing things I do in Charles, I'm sold!

Proxyman version? (Ex. Proxyman 1.4.3)

Version 2.32.1 (23210)

macOS Version? (Ex. mac 10.14)

12.0

Steps to reproduce

Setup manual proxy to 192.168.1.10:8888 (I changed the default port to match what Charles Proxy uses)
Install and accept cert

Expected behavior

I expect SSL traffic to https://www.google.com to decode

Instead I get:
SSL Handshake Failed
handshakeFailed(NIOSSL.BoringSSLError.sslError([Error: 268435613 error:1000009d:SSL routines:OPENSSL_internal:INAPPROPRIATE_FALLBACK]))

Screenshots (optional)

screenshot-09062021-175208
screenshot-09062021-175238
Screen Shot 2021-09-06 at 5 53 00 PM

Originally created by @mlaster on GitHub (Sep 7, 2021). Original GitHub issue: https://github.com/ProxymanApp/Proxyman/issues/978 Originally assigned to: @NghiaTranUIT on GitHub. I'm evaluating ProxyMan as a replacement for Charles Proxy. Charles works, but I've always hated the interface. If I can get ProxyMan to do the same thing things I do in Charles, I'm sold! ### Proxyman version? (Ex. Proxyman 1.4.3) Version 2.32.1 (23210) ### macOS Version? (Ex. mac 10.14) 12.0 ### Steps to reproduce Setup manual proxy to 192.168.1.10:8888 (I changed the default port to match what Charles Proxy uses) Install and accept cert ### Expected behavior I expect SSL traffic to https://www.google.com to decode Instead I get: SSL Handshake Failed handshakeFailed(NIOSSL.BoringSSLError.sslError([Error: 268435613 error:1000009d:SSL routines:OPENSSL_internal:INAPPROPRIATE_FALLBACK])) ### Screenshots (optional) ![screenshot-09062021-175208](https://user-images.githubusercontent.com/22513/132268854-f009bff0-d8dc-4e57-9fb6-f2b9ccc5af5f.png) ![screenshot-09062021-175238](https://user-images.githubusercontent.com/22513/132268885-876c9d41-f51d-4438-add6-55f803237070.png) <img width="702" alt="Screen Shot 2021-09-06 at 5 53 00 PM" src="https://user-images.githubusercontent.com/22513/132268899-06e91a0d-9d54-4264-b1af-231c88fe8af0.png">
kerem closed this issue 2026-03-03 19:23:27 +03:00
Author
Owner

@NghiaTranUIT commented on GitHub (Sep 7, 2021):

Hey, look like you haven't trusted the Certificate on your iPhone devices. You can do it in the Setting app -> General > About > > Certificate Trust Settings > Switch ON

You can access the iOS guideline at Certificate Menu -> Install Certificate for iOS -> physical device 👍

Document: https://docs.proxyman.io/debug-devices/ios-device

<!-- gh-comment-id:913917987 --> @NghiaTranUIT commented on GitHub (Sep 7, 2021): Hey, look like you haven't trusted the Certificate on your iPhone devices. You can do it in the Setting app -> General > About > > Certificate Trust Settings > Switch ON You can access the iOS guideline at Certificate Menu -> Install Certificate for iOS -> physical device 👍 Document: https://docs.proxyman.io/debug-devices/ios-device
Author
Owner

@NghiaTranUIT commented on GitHub (Sep 7, 2021):

@mlaster Please let me know if it works for you. Basically, Proxyman is capable of capturing traffic from your iOS physical devices and Simulator too 😄

<!-- gh-comment-id:913918380 --> @NghiaTranUIT commented on GitHub (Sep 7, 2021): @mlaster Please let me know if it works for you. Basically, Proxyman is capable of capturing traffic from your iOS physical devices and Simulator too 😄
Author
Owner

@mlaster commented on GitHub (Sep 7, 2021):

Oops....I just realized my mistake. I didn't do step 2. I feel dumb now :). It works. Feel free to close this ticket.

<!-- gh-comment-id:913919441 --> @mlaster commented on GitHub (Sep 7, 2021): Oops....I just realized my mistake. I didn't do step 2. I feel dumb now :). It works. Feel free to close this ticket.
Author
Owner

@NghiaTranUIT commented on GitHub (Sep 7, 2021):

Awesome. You're sold 😉

<!-- gh-comment-id:913919757 --> @NghiaTranUIT commented on GitHub (Sep 7, 2021): Awesome. You're sold 😉
Author
Owner

@mlaster commented on GitHub (Sep 7, 2021):

Awesome. You're sold 😉

Definitely. Just bought a license.

I’m having trouble with rewriting the body. I’m trying the example:

function onResponse(context, url, request, response) {
// console.log(response);

// Make sure Request Header Content-Type is: application/json or JSON Families
// Get Request body
var jsonBody = request.body;


// Modify data
jsonBody["name"] = "Proxyman";
jsonBody["flatform"] = "macOS";
jsonBody["info"] = { 
                    "website": "proxyman.io",
                    "region": "Earth"
                   };
// Set it again        
request.body = jsonBody;

return request;
}

And I get errors:

19:43:12.341: [onResponse] with Request ID=133
Error: TypeError: undefined is not an object (evaluating 'jsonBody["name"] = "Proxyman"')
⚠️Warning: Skip executing the onResponse() because it's missing!

My response that I’m rewriting is JSON:

HTTP/1.1 200 OK
Server: AppleHttpServer/aa2945d2cf9ee3607ca5986660a23b09c6d0718e
Date: Tue, 07 Sep 2021 02:40:35 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 1043
Connection: keep-alive
X-Apple-Jingle-Correlation-Key: 4L3AHNJQHJAPLEWGT3DHIQY5ZY
apple-seq: 0
apple-tk: false
Apple-Originating-System: UnknownOriginatingSystem
X-Responding-Instance: acsnservice:2:prod-p00-acsnservice--partial-7b57c88c5b-n5ftx:80:2116B766:73a0e6e20236
content-encoding: gzip
Strict-Transport-Security: max-age=31536000; includeSubDomains;
via: xrail:mr47p00ic-qujn04081701.me.com:8301:21D269:grp23,631194250daa17e24277dea86cf30319:efc93d238909740ff9547602818982e2:ussjc1
X-Apple-Request-UUID: e2f603b5-303a-40f5-92c6-9ec674431dce
access-control-expose-headers: X-Apple-Request-UUID,Via
X-Apple-Edge-Response-Time: 118

{"overrideACSNHostName":false,"preventDuplicateNotifyWhenFoundNotification":true,"keyDistributionInitialDurationInMin":1440,"maximumPublishesPerDayBattery":48,"maximumPayloadsToPublish":200,"nearbyTimeIntervalInSec":60,"firmwareUpdateCheckFrequencyInMin":150,"minimumLocationsToTriangulate":3,"beaconingEnabled":true,"publishGracePeriod":900,"activePublishPolicies":["onPowerOnWiFi","onPowerOnCell","onBatteryOnWiFi","onBatteryOnCell"],"enableBackgroundScanning":true,"publishInterval":900,"serialNumber":15,"keyDistributionDurationInMin":2880,"pairingTimeoutInSec":60,"keyDistributionSendFrequencyInMin":1440,"fetchOverlapInMin":60,"packageMaximumPublishingIntervalInSec":900,"maximumEphemeralLocationsToRetain":5,"maximumPublishesPerDayCharging":48,"finderEnabled":true,"selfBeaconingKeyRollIntervalInMin":15,"keyDistributionSendGracePeriodInMin":720,"maximumKeysPerFetchRequest":300,"perBeaconSharingLimit":16,"maximumDaysToFetch":7,"minimumLocationFetchInterval":30,"maximumLeashedBeacons":4,"macBeaconConfigs":{"normalBattery":{"fastRollAdvertisementIntervalInSecs":900,"postInitialDayAdvertisementTimes":[11,18],"initialNoBeaconPeriodInSecs":0,"slowRollNoAdvertisementDurationInSecs":10800,"stateChangeToleranceInSecs":900,"fastRollDurationInSecs":7200,"slowRollNoAdvertisementDurationDecayFactor":1.5,"slowRollDurationInSecs":3600}},"ephemeralLocationStoreEnabled":true,"maximumPayloadsPerRollInterval":3,"beaconCacheExpiryAgeInSec":604800,"statusCode":"200","firmwareUpdateBlackoutPeriodInMin":120,"description":"success","finderState":true,"maximumFetchTerminationTimeGapInMin":60,"beaconMaximumCacheRecords":50000,"firmwareUpdateCheckGracePeriodInMin":30,"fwuQuiescentTimeIntervalInHours":24,"acceptVersion":2,"lostModePublishInterval":172800,"beaconingKeysBatchDurationInMin":60,"inBTRangeDistanceInMeters":20,"acsnHostName":"gateway.icloud.com/acsnservice","maximumTrackedLocations":10,"packageMinimumPublishingIntervalInSec":900,"maxPairEligibleDevices":16,"useReductiveFiltering":true,"useNewFetchProtocol":true,"maximumLocationsToFetch":20,"allowsDrafting":true,"featureSupportMatrix":{"separationMonitoring":{"productTypeOverride":{},"minimumSoftwareVersion":{"iPhone":"19A0","MacBookPro":"21A0","iPad":"19A0","iPod":"19A0","MacBookAir":"21A0"},"enabled":true,"minimumProductVersion":{"iPhone":8,"MacBookPro":17,"iPad":5,"iPod":9,"MacBookAir":10}}}}

<!-- gh-comment-id:913949493 --> @mlaster commented on GitHub (Sep 7, 2021): > Awesome. You're sold 😉 > > Definitely. Just bought a license. I’m having trouble with rewriting the body. I’m trying the example: function onResponse(context, url, request, response) { // console.log(response); // Make sure Request Header Content-Type is: application/json or JSON Families // Get Request body var jsonBody = request.body; // Modify data jsonBody["name"] = "Proxyman"; jsonBody["flatform"] = "macOS"; jsonBody["info"] = { "website": "proxyman.io", "region": "Earth" }; // Set it again request.body = jsonBody; return request; } And I get errors: 19:43:12.341: [onResponse] with Request ID=133 ❌Error: TypeError: undefined is not an object (evaluating 'jsonBody["name"] = "Proxyman"') ⚠️Warning: Skip executing the onResponse() because it's missing! My response that I’m rewriting is JSON: HTTP/1.1 200 OK Server: AppleHttpServer/aa2945d2cf9ee3607ca5986660a23b09c6d0718e Date: Tue, 07 Sep 2021 02:40:35 GMT Content-Type: application/json; charset=UTF-8 Content-Length: 1043 Connection: keep-alive X-Apple-Jingle-Correlation-Key: 4L3AHNJQHJAPLEWGT3DHIQY5ZY apple-seq: 0 apple-tk: false Apple-Originating-System: UnknownOriginatingSystem X-Responding-Instance: acsnservice:2:prod-p00-acsnservice--partial-7b57c88c5b-n5ftx:80:2116B766:73a0e6e20236 content-encoding: gzip Strict-Transport-Security: max-age=31536000; includeSubDomains; via: xrail:mr47p00ic-qujn04081701.me.com:8301:21D269:grp23,631194250daa17e24277dea86cf30319:efc93d238909740ff9547602818982e2:ussjc1 X-Apple-Request-UUID: e2f603b5-303a-40f5-92c6-9ec674431dce access-control-expose-headers: X-Apple-Request-UUID,Via X-Apple-Edge-Response-Time: 118 {"overrideACSNHostName":false,"preventDuplicateNotifyWhenFoundNotification":true,"keyDistributionInitialDurationInMin":1440,"maximumPublishesPerDayBattery":48,"maximumPayloadsToPublish":200,"nearbyTimeIntervalInSec":60,"firmwareUpdateCheckFrequencyInMin":150,"minimumLocationsToTriangulate":3,"beaconingEnabled":true,"publishGracePeriod":900,"activePublishPolicies":["onPowerOnWiFi","onPowerOnCell","onBatteryOnWiFi","onBatteryOnCell"],"enableBackgroundScanning":true,"publishInterval":900,"serialNumber":15,"keyDistributionDurationInMin":2880,"pairingTimeoutInSec":60,"keyDistributionSendFrequencyInMin":1440,"fetchOverlapInMin":60,"packageMaximumPublishingIntervalInSec":900,"maximumEphemeralLocationsToRetain":5,"maximumPublishesPerDayCharging":48,"finderEnabled":true,"selfBeaconingKeyRollIntervalInMin":15,"keyDistributionSendGracePeriodInMin":720,"maximumKeysPerFetchRequest":300,"perBeaconSharingLimit":16,"maximumDaysToFetch":7,"minimumLocationFetchInterval":30,"maximumLeashedBeacons":4,"macBeaconConfigs":{"normalBattery":{"fastRollAdvertisementIntervalInSecs":900,"postInitialDayAdvertisementTimes":[11,18],"initialNoBeaconPeriodInSecs":0,"slowRollNoAdvertisementDurationInSecs":10800,"stateChangeToleranceInSecs":900,"fastRollDurationInSecs":7200,"slowRollNoAdvertisementDurationDecayFactor":1.5,"slowRollDurationInSecs":3600}},"ephemeralLocationStoreEnabled":true,"maximumPayloadsPerRollInterval":3,"beaconCacheExpiryAgeInSec":604800,"statusCode":"200","firmwareUpdateBlackoutPeriodInMin":120,"description":"success","finderState":true,"maximumFetchTerminationTimeGapInMin":60,"beaconMaximumCacheRecords":50000,"firmwareUpdateCheckGracePeriodInMin":30,"fwuQuiescentTimeIntervalInHours":24,"acceptVersion":2,"lostModePublishInterval":172800,"beaconingKeysBatchDurationInMin":60,"inBTRangeDistanceInMeters":20,"acsnHostName":"gateway.icloud.com/acsnservice","maximumTrackedLocations":10,"packageMinimumPublishingIntervalInSec":900,"maxPairEligibleDevices":16,"useReductiveFiltering":true,"useNewFetchProtocol":true,"maximumLocationsToFetch":20,"allowsDrafting":true,"featureSupportMatrix":{"separationMonitoring":{"productTypeOverride":{},"minimumSoftwareVersion":{"iPhone":"19A0","MacBookPro":"21A0","iPad":"19A0","iPod":"19A0","MacBookAir":"21A0"},"enabled":true,"minimumProductVersion":{"iPhone":8,"MacBookPro":17,"iPad":5,"iPod":9,"MacBookAir":10}}}}
Author
Owner

@NghiaTranUIT commented on GitHub (Sep 7, 2021):

Hey, your script is incorrect in terms of syntax:
Look like you are trying to rewrite the Response Body, but you are incorrectly using the request object.

// => onResponse
function onResponse(context, url, request, response) {
//    console.log(response);

    // Make sure Request Header Content-Type is: application/json or JSON Families
    // Get Request body
    var jsonBody = request.body; // ❌ But you get request's body?


    // Modify data
    jsonBody["name"] = "Proxyman";
    jsonBody["flatform"] = "macOS";
    jsonBody["info"] = {
                        "website": "proxyman.io",
                        "region": "Earth"
                       };
    // Set it again
    request.body = jsonBody; // ❌ Set to request body

  return request; // ❌ Must return response on onResponse()
}

It should be:

function onResponse(context, url, request, response) {
//    console.log(response);

    // Make sure Request Header Content-Type is: application/json or JSON Families
    // Get Request body
    var jsonBody = response.body;


    // Modify data
    jsonBody["name"] = "Proxyman";
    jsonBody["flatform"] = "macOS";
    jsonBody["info"] = {
                        "website": "proxyman.io",
                        "region": "Earth"
                       };
    // Set it again
    response.body = jsonBody;

  return response;
}
<!-- gh-comment-id:913951790 --> @NghiaTranUIT commented on GitHub (Sep 7, 2021): Hey, your script is incorrect in terms of syntax: Look like you are trying to rewrite the Response Body, but you are incorrectly using the `request` object. ```js // => onResponse function onResponse(context, url, request, response) { // console.log(response); // Make sure Request Header Content-Type is: application/json or JSON Families // Get Request body var jsonBody = request.body; // ❌ But you get request's body? // Modify data jsonBody["name"] = "Proxyman"; jsonBody["flatform"] = "macOS"; jsonBody["info"] = { "website": "proxyman.io", "region": "Earth" }; // Set it again request.body = jsonBody; // ❌ Set to request body return request; // ❌ Must return response on onResponse() } ``` It should be: ```js function onResponse(context, url, request, response) { // console.log(response); // Make sure Request Header Content-Type is: application/json or JSON Families // Get Request body var jsonBody = response.body; // Modify data jsonBody["name"] = "Proxyman"; jsonBody["flatform"] = "macOS"; jsonBody["info"] = { "website": "proxyman.io", "region": "Earth" }; // Set it again response.body = jsonBody; return response; } ```
Author
Owner

@NghiaTranUIT commented on GitHub (Sep 7, 2021):

Look like you're trying a snippet code from https://docs.proxyman.io/scripting/snippet-code#json-body

Please make sure you call it properly for onRequest() or onResponse()

<!-- gh-comment-id:913952706 --> @NghiaTranUIT commented on GitHub (Sep 7, 2021): Look like you're trying a snippet code from https://docs.proxyman.io/scripting/snippet-code#json-body Please make sure you call it properly for `onRequest()` or `onResponse()`
Author
Owner

@mlaster commented on GitHub (Sep 7, 2021):

Thanks. I copied the wrong sample. I should stop hacking around with it tonight and wait until tomorrow until I have more brain. Sorry for the dumb questions :)

On Sep 6, 2021, at 7:57 PM, Nghia Tran @.***> wrote:

Look like you're trying a snippet code from https://docs.proxyman.io/scripting/snippet-code#json-body https://docs.proxyman.io/scripting/snippet-code#json-body
Please make sure you call it properly for onRequest() or onResponse()


You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub https://github.com/ProxymanApp/Proxyman/issues/978#issuecomment-913952706, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAFP4NOY5SMPBH6C2AB7NTUAV5Q5ANCNFSM5DRJJOMQ.
Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

<!-- gh-comment-id:913954635 --> @mlaster commented on GitHub (Sep 7, 2021): Thanks. I copied the wrong sample. I should stop hacking around with it tonight and wait until tomorrow until I have more brain. Sorry for the dumb questions :) > On Sep 6, 2021, at 7:57 PM, Nghia Tran ***@***.***> wrote: > > > Look like you're trying a snippet code from https://docs.proxyman.io/scripting/snippet-code#json-body <https://docs.proxyman.io/scripting/snippet-code#json-body> > Please make sure you call it properly for onRequest() or onResponse() > > — > You are receiving this because you modified the open/close state. > Reply to this email directly, view it on GitHub <https://github.com/ProxymanApp/Proxyman/issues/978#issuecomment-913952706>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AAAFP4NOY5SMPBH6C2AB7NTUAV5Q5ANCNFSM5DRJJOMQ>. > Triage notifications on the go with GitHub Mobile for iOS <https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675> or Android <https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>. >
Author
Owner

@NghiaTranUIT commented on GitHub (Sep 7, 2021):

You're welcome. Let me know if you have any problems 👍

<!-- gh-comment-id:913955092 --> @NghiaTranUIT commented on GitHub (Sep 7, 2021): You're welcome. Let me know if you have any problems 👍
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/Proxyman#973
No description provided.