عباس عامریان
3 سال پیش توسط عباس عامریان مطرح شد
9 پاسخ

Laravel Websockets SSL

با سلام
بنده Laravel Websocket رو روی http به درستی بالا آوردم
به VPS انتقال دادم بازم http به درستی کار میکنه
زمانی که روی https قرار میدم تنظیمات broadcast رو از سمت Laravel Echo به درستی متصل میشه و statistics هم روی پورت 6002 به درستی به event ها گوش می ده ولی زمان ارسال Event خطای زیر رو دریافت میکنم:

cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://0.0.0.0:6002/apps/local/events?

تنظیمات من به چه صورت
websocket.php

<?php

use BeyondCode\LaravelWebSockets\Dashboard\Http\Middleware\Authorize;

return [

    /*
     * Set a custom dashboard configuration
     */
    'dashboard' => [
        'port' => env('LARAVEL_WEBSOCKETS_PORT', 6002),
    ],

    /*
     * This package comes with multi tenancy out of the box. Here you can
     * configure the different apps that can use the webSockets server.
     *
     * Optionally you specify capacity so you can limit the maximum
     * concurrent connections for a specific app.
     *
     * Optionally you can disable client events so clients cannot send
     * messages to each other via the webSockets.
     */
    'apps' => [
        [
            'id' => 'local',
            'name' => 'Notify',
            'key' => 'local',
            'secret' => 'local',
            'path' => env('PUSHER_APP_PATH'),
            'capacity' => null,
            'enable_client_messages' => false,
            'enable_statistics' => true,
        ],
    ],

    /*
     * This class is responsible for finding the apps. The default provider
     * will use the apps defined in this config file.
     *
     * You can create a custom provider by implementing the
     * `AppProvider` interface.
     */
    'app_provider' => BeyondCode\LaravelWebSockets\Apps\ConfigAppProvider::class,

    /*
     * This array contains the hosts of which you want to allow incoming requests.
     * Leave this empty if you want to accept requests from all hosts.
     */
    'allowed_origins' => [
        //
    ],

    /*
     * The maximum request size in kilobytes that is allowed for an incoming WebSocket request.
     */
    'max_request_size_in_kb' => 250,

    /*
     * This path will be used to register the necessary routes for the package.
     */
    'path' => 'laravel-websockets',

    /*
     * Dashboard Routes Middleware
     *
     * These middleware will be assigned to every dashboard route, giving you
     * the chance to add your own middleware to this list or change any of
     * the existing middleware. Or, you can simply stick with this list.
     */
    'middleware' => [
        'web',
        Authorize::class,
    ],

    'statistics' => [
        /*
         * This model will be used to store the statistics of the WebSocketsServer.
         * The only requirement is that the model should extend
         * `WebSocketsStatisticsEntry` provided by this package.
         */
        'model' => \BeyondCode\LaravelWebSockets\Statistics\Models\WebSocketsStatisticsEntry::class,

        /**
         * The Statistics Logger will, by default, handle the incoming statistics, store them
         * and then release them into the database on each interval defined below.
         */
        'logger' => BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger::class,

        /*
         * Here you can specify the interval in seconds at which statistics should be logged.
         */
        'interval_in_seconds' => 60,

        /*
         * When the clean-command is executed, all recorded statistics older than
         * the number of days specified here will be deleted.
         */
        'delete_statistics_older_than_days' => 60,

        /*
         * Use an DNS resolver to make the requests to the statistics logger
         * default is to resolve everything to 127.0.0.1.
         */
        'perform_dns_lookup' => false,
    ],

    /*
     * Define the optional SSL context for your WebSocket connections.
     * You can see all available options at: http://php.net/manual/en/context.ssl.php
     */
    'ssl' => [
        /*
         * Path to local certificate file on filesystem. It must be a PEM encoded file which
         * contains your certificate and private key. It can optionally contain the
         * certificate chain of issuers. The private key also may be contained
         * in a separate file specified by local_pk.
  */
        'local_cert' => '/home/home/user/SSL/title.crt',

        /*
         * Path to local private key file on filesystem in case of separate files for
         * certificate (local_cert) and private key.
         */
        'local_pk' => '/home/user/name/SSL/title.key',

         * Passphrase for your local_cert file.
         * Passphrase for your local_cert file.
         */
        'passphrase' =>null,
        'verify_peer' => false,
//        'allow_self_signed' => true,
    ],

    /*
     * Channel Manager
     * This class handles how channel persistence is handled.
     * By default, persistence is stored in an array by the running webserver.
     * The only requirement is that the class should implement
     * `ChannelManager` interface provided by this package.
     */
    'channel_manager' => \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager::class,
];

Broadcasting.php

        'pusher' => [
            'driver' => 'pusher',
            'key' => 'local',
            'secret' => 'local',
            'app_id' => 'local',
            'options' => [
                'cluster' => 'mt1',
                'encrypted' => true,
                'host' => '0.0.0.0',
                'port' => 6002,
                'useTLS' => true,
                'scheme' => 'https',
                'curl_options' => [
                    CURLOPT_SSL_VERIFYHOST => 0,
                    CURLOPT_SSL_VERIFYPEER => 0,
                ]
            ]
        ],

web.php

Route::get('/broadcast', function () {

    broadcast(new \App\Events\ellow('پیام'));
    return response()->json(['done'=>'done']);
});

event.php

class ellow implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;

    public function __construct($message)
    {
        $this->message = $message;
    }

//    public function broadcastWith()
//    {
//        return [
//            'hello' => 'there'
//        ];
//    }
    public function broadcastOn()
    {
        return ['channel'];
    }

    public function broadcastAs()
    {
        return 'ellow';
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
//    public function broadcastOn()
//    {
//        return new Channel('channel');
//    }
}

حالت های متفاوت زیادی رو آزمون خطا کردیم الان وضعیت پروژه من به این صورت بالا فرستادم
همچنین certificate های SSL رو از توی Cpanel توی فایل کپی کردم و توی پروژ laravel قرار دادم و آدرس رو به websocket.php دادم مطمعن نیستم این کار درسته(البته وقتی certificate ها ی SSL رو تغییر میدم دیگه از statistics نمیشه متصل شد)
ممنون میشم کسی راه حلی ارائه بده
@hesammousavi


ثبت پرسش جدید
عباس عامریان
تخصص : توسعه دهنده وب
@abbas.ameriyan 1 سال پیش آپدیت شد
1

سلام عزیزان وقت بخیر
میتونید توی مقاله بنده اطلاعات بیشتری در مورد این موضوع دریافت کنید
Medium


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 3 سال پیش مطرح شد
0

سلام دوست عزیز
من با websocket روی vps مشکل دارم
سیستم عامل بنده ubuntu هست
رو لوکال کار میکنه اما سرور نه
مشکلتون برطرف شد؟


عباس عامریان
تخصص : توسعه دهنده وب
@abbas.ameriyan 3 سال پیش آپدیت شد
1

سلام
بله روی http موفق به پیاده سازی شدم ولی روی https نه هنوز ،احتمالا نیاز به certificate ها معتبر ssl باشه


میلاد خسروی
تخصص : برنامه نویس بامزه
@milwad 3 سال پیش مطرح شد
رسول شبانی
تخصص : برنامه نویس لاراول
@rasool_sh 1 سال پیش مطرح شد
1

مشکلتون حل شده؟؟


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش مطرح شد
1

@rasool_sh
سلام
اول این که با cerbot باید برای پروژه ی websocket خودت https بزاری و ssl فعال کنی
مرحله دوم سطح دسترسی بدی بهش

    cd /etc/letsencrypt/
    sudo chown -R root:www-data live/ archive/
    sudo chmod -R 755 live/ archive/

مرحله اخر اون دامنه ای که برای وب سوکتت هست رو توی لاراول باید بیایی cert و pk رو توی .env قرار بدی مسیر دقیقش رو هرجایی که توی لینوکست هست مثلا یه جیزی تو مایه های اینه

LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT=/etc/letsencrypt/live/your_websocket_domain/fullchain.pem
LARAVEL_WEBSOCKETS_SSL_LOCAL_PK=/etc/letsencrypt/live/your_websocket_domain/privkey.pem

رسول شبانی
تخصص : برنامه نویس لاراول
@rasool_sh 1 سال پیش مطرح شد
0

@salar.mohammad2013
این کار رو کردم ولی هم رو حالت Ws و هم رو حالت wss نشد بهش کانکت بشم


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 1 سال پیش آپدیت شد
0

@rasoolsh
گاها به خاطر catch شدن نیاز هست سرور یه ریستارت بکنی و سوپروایزو این داستانایی که قرار دادی هم دوباره ران شه
من خودم دارم استفاده میکنم از وب سوکت با ssl
اگر باز هم مشکلت حل نشد تمایل داشتی آیدی تلگرامت رو قرار بده باید کانفیگ کاملش از اول با دو پروژه لاراولی برات بالا بیارم
البته فکر میکنم پچیم هم وب سوکت رو پیاده سازی بکنه برات باید مستنداتش ببینی


عباس عامریان
تخصص : توسعه دهنده وب
@abbas.ameriyan 1 سال پیش آپدیت شد
1

سلام عزیزان وقت بخیر
میتونید توی مقاله بنده اطلاعات بیشتری در مورد این موضوع دریافت کنید
Medium


رسول شبانی
تخصص : برنامه نویس لاراول
@rasool_sh 1 سال پیش مطرح شد
2

@abbas.ameriyan
@salar.mohammad2013
من راه هایی که شما گفتین رو امتحان کردم ولی باز هم موفق نشدم
من به روش دیگ پیاده کردم و جواب هم گرفتم و اینجا توضیح میدم شاید به درد کسی خورد
شخصا به جای laravel websocket از soketi استفاده کردم ولی در کل فرقی نداره از کدوم استفاده کنیم
یه ساب دامین ساختم به این شکل websocket.domain.com بعد براش SSL جنریت کردم
تا اینجاش که خیلی راحت و آسونه
بعدش تو کانفیگ ساب دامین ام روت اصلی رو به 127.0.0.1:۶۰۰۱ ریورس پراکسی (reverse proxy) کردم و روت /app که درایور پوشر لاراول به این روت درخواست میزنه رو هم به 127.0.0.1:6001/app ریورس پراکسی کردم
و حالا خیلی راحت و بدون مشکل میتونم از طریق همین ساب دامین و پورت های ۸۰ و ۴۴۳ به وبسوکت دسترسی داشته باشم
درباره ریورس پراکسی و چگونگی فعال کردنش هم مقاله و ویدیو زیاده دیگ اینجا جاش نیس اینو توضیح داد
امیدوارم افرادی که به این تاپیک میرسن مطالب به دردشون بخوره چون من خودم اینقدر سرچ و تاپیک و داکیومنت خوندم واس حل این موضوع که دیگ رد داده بودم 😂
البته این روش رو بعد از روش های بالا که دوستان گفتن انجام بدید چون روش های بالا پیچیدگی کمتری داره اگه تو مباحث سرور دانش کم تری دارید🙏


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام